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など)を介して実行したい場合、アルゴリズムは配列構造を分析する必要があります (各 [フォルダー] の名前を確認し、存在するかどうかを確認します)。 1 つ以上のフォルダ ['_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

これはあなたの質問に対する正確な答えではありませんが、xml <-> arrayコードの代わりに、SimpleXMLとそのXPath機能を 使用できます。

<?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リファレンスを参照してください)

編集:エリックのコメントへの返信(コメントに収めるには少し難しすぎる)

配列がどのように機能するかについて混乱するかもしれません。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 に答える