0

私はこのようなsimplexmlオブジェクトを持っています

<aaaa>
    <bbbb>0000</bbbb>
    <cccc>0000</cccc>
    <dddd>
        <eeee>
          <gggg>1111</gggg>
          <hhhh>2222</hhhh>
          <mmmm>3333</mmmm>
        </eeee>
        <eeee>
          <gggg>4444</gggg>
          <hhhh>5555</hhhh>
          <mmmm>6666</mmmm>
        </eeee>
        <eeee>
          <gggg>7777</gggg>
          <hhhh>8888</hhhh>
          <mmmm>9999</mmmm>
        </eeee>
    </dddd>
</aaaa>

次のような新しい構造を取得するにはどうすればよいですか?(ddddの子の同じリストを逆の順序で含む新しい要素ffff)

<aaaa>
    <bbbb>0000</bbbb>
    <cccc>0000</cccc>
    <dddd>
        <eeee>
          <gggg>1111</gggg>
          <hhhh>2222</hhhh>
          <mmmm>3333</mmmm>
        </eeee>
        <eeee>
          <gggg>4444</gggg>
          <hhhh>5555</hhhh>
          <mmmm>6666</mmmm>
        </eeee>
        <eeee>
          <gggg>7777</gggg>
          <hhhh>8888</hhhh>
          <mmmm>9999</mmmm>
        </eeee>
    </dddd>
    <ffff>
        <eeee>
          <gggg>7777</gggg>
          <hhhh>8888</hhhh>
          <mmmm>9999</mmmm>
        </eeee>
        <eeee>
          <gggg>4444</gggg>
          <hhhh>5555</hhhh>
          <mmmm>6666</mmmm>
        </eeee>
        <eeee>
          <gggg>1111</gggg>
          <hhhh>2222</hhhh>
          <mmmm>3333</mmmm>
        </eeee>
    </ffff>
</aaaa>

ddddの子を反復処理し、それらをオブジェクトの配列に挿入してarray_reverseで反転しようとしましたが、オブジェクトをメイン構造に挿入し直そうとすると、結果が壊れたり不完全になったりします。

4

1 に答える 1

1

<ffff>これらの子要素をループして、正しい順序で 新しい要素に挿入できます。

これは、既存の使用法とDOM拡張SimpleXMLElement機能で利用可能な追加機能を組み合わせることで最も簡単に実行できます。中間配列や並べ替えは必要ありません。

$aaaa = simplexml_load_string($xml_string);

// Add new <ffff> element
$ffff = $aaaa->addChild('ffff');

// Get DOMElement instance for <ffff>
$ffff_dom = dom_import_simplexml($ffff);

// Loop over <dddd> children and prepend to <ffff>
foreach ($aaaa->dddd->children() as $child) {
    $child_copy = dom_import_simplexml($child)->cloneNode(TRUE);
    $ffff_dom->insertBefore($child_copy, $ffff_dom->firstChild);
}

// Go back to SimpleXML-land and see the result
echo $aaaa->saveXML();

オンラインで実行されているこの例を参照してください。

于 2012-11-18T23:27:41.623 に答える