1

我在 PHP 中使用数组来修改 xml 数据并将其写回。这是 xml 结构(为演示目的而简化):

<docs>
  <folder>
    <name>Folder name</name>
    <date>20.06.2009</date>
    <folder>
      <name>Subfolder1</name>
      <date></date>
    </folder>
    <folder>
      <name>Subfolder1</name>
      <date></date>
    </folder>
    <file>
      <name></name>
    </file>
  </folder>
  <name></name>
  <date></date>
</docs>

使用此代码,然后将其解析并转换为多维数组:

Array
(
    [docs] => Array
        (
            [_c] => Array
                (
                    [folder] => Array
                        (
                            [_c] => Array
                                (
                                    [name] => Array
                                        (
                                            [_v] => Folder name
                                        )

                                    [date] => Array
                                        (
                                            [_v] => 20.06.2009
                                        )

                                    [folder] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [_c] => Array
                                                        (
                                                            [name] => Array
                                                                (
                                                                    [_v] => Subfolder1
                                                                )

                                                            [date] => Array
                                                                (
                                                                    [_v] => 
                                                                )

                                                        )

                                                )

                                            [1] => Array
                                                (
                                                    [_c] => Array
                                                        (
                                                            [name] => Array
                                                                (
                                                                    [_v] => Subfolder1
                                                                )

                                                            [date] => Array
                                                                (
                                                                    [_v] => 
                                                                )

                                                        )

                                                )

                                        )

                                    [file] => Array
                                        (
                                            [_c] => Array
                                                (
                                                    [name] => Array
                                                        (
                                                            [_v] => 
                                                        )

                                                )

                                        )

                                )

                        )

                    [name] => Array
                        (
                            [_v] => 
                        )

                    [date] => Array
                        (
                            [_v] => 
                        )

                )

        )

)

很长,我知道。但现在到了实际问题。在这种情况下,如果我想将另一个文件添加到名为Subfolder2的子文件夹中,那么当您看到结构时手动执行它不是问题:

array_push($array['docs']['_c']['folder']['_c']['folder'][1], $newfile);

现在,当我想通过只知道文件夹路径的函数(如docs/Folder name/Subfolder2)来执行此操作时,算法必须分析数组结构(检查每个 [文件夹] 的名称,检查是否有一个或多个文件夹 ['_c'] 或 [number]) - 都很好,但我找不到一种方法来创建一个变量,该变量将具有该新文件的“数组”路径。

我在沿着这些思路思考:

$writepath = "['docs']['_c']['folder']...[1]"; // path string
array_push($array{$writepath}, $newfile);

当然,这不是一个有效的语法。

那么,如何创建一个包含通过数组元素的路径的变量?我对 w3c 和 php.net 做了一些研究,发现没有关于多维数组的有用信息......

如果有人对结构、xml 转换/操作等有任何其他建议,我知道这远远不够数据处理的方式。

感谢您的任何意见,

埃里克


编辑:关于参考,是否可以参考参考?因为那将是通过一组数组移动“指针”的方式?像这样的东西:

$pointer = &$array['docs'];
if (key($pointer) == '_c') { $pointer = &$pointer['_c']; }
else (
  // create an array with '_c' key instead of empty '_v' array
)

此语法不起作用。

编辑:语法有效,没关系...感谢您的所有帮助!

4

2 回答 2

4

尽管这不完全是您问题的答案:您可以使用SimpleXML及其 XPath 功能来代替 xml<->array 代码。

<?php
$xml = '<docs>
  <folder>
    <name>Folder name</name>
    <date>20.06.2009</date>
    <folder>
      <name>Subfolder1</name>
      <date></date>
    </folder>
    <folder>
      <name>Subfolder2</name>
      <date></date>
      <folder>
        <name>Subfolder3</name>
        <date></date>
      </folder>
    </folder>
  </folder>
</docs>';

$doc = new SimpleXMLElement($xml); $pathToParentelement = '//folder[name="Subfolder3"]'; $element = $doc->xpath($pathToParentelement); isset($element[0]) or die('not found');
$newFolder = $element[0]->addChild("folder"); $newFolder->name = "Subfolder4.1"; $newFolder->date = date(DATE_RFC822);
// let's see the result echo $doc->asxml();

$pathToParentelement 或多或少是你的 $writepath。

于 2009-06-20T09:30:34.500 回答
2

使用参考可能会有所帮助。

您可以首先编写一个函数,该函数返回对路径字符串数组给定部分的引用。例如,get_path_array("Documents")将返回$array['docs']['_c']['folder']['_c']['folder'][1], $newfile)

<?php
function &get_path_array($path_str)
{
    // your code to seek to seek the path in the array
    return $result;
}
>?php

现在要添加一个元素,你可以这样做

array_push(get_path_array("docs/Folder name/Subfolder2"), $newfile);

那是你要找的吗?

(有关更多信息,请参阅php 参考资料

编辑:回复 Eric 的评论(有点难以融入评论)

我认为您可能对数组的工作方式感到困惑。php 中实际上没有多维数组之类的东西,只有存储其他数组的数组。例如,

<?php
$a = array(array(1,2,3), array(4,5,6));
$b = $a[1];
echo $b[0];
?>

将输出“4”。

请注意,在上面的代码中,$b是 的副本$a[1],更改$b不会影响$a[1]. 但是,使用引用,这可以工作:

<?php
$a = array(array(1,2,3), array(4,5,6));
$b = &$a[1]; // the & make $b a reference to $a[1]
$b[0] = 4242;
print_r($a);
?>

输出:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

    [1] => Array
        (
            [0] => 4242
            [1] => 5
            [2] => 6
        )

)

所以永远不需要生成字符串$array['doc']['path'],你只需使用循环来寻找正确的数组。

于 2009-06-20T09:30:25.640 回答