如何反转simplexmlelement列表的顺序?

时间:2012-11-18 23:14:17

标签: php xml

我有一个像这样的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>

如何获得如下所示的新结构? (新元素ffff包含相反顺序的dddd子项列表)

<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进行反转...但是当我尝试将对象插回到主结构中时,结果会被破坏/不完整

1 个答案:

答案 0 :(得分:1)

您可以循环遍历这些子元素,并以正确的顺序将它们插入到新的<ffff>元素中。

通过将现有的SimpleXMLElement用法与DOM extension提供的额外功能相结合,可以轻松完成此操作。不需要中间数组或对它们进行排序。

$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();

See this example running online.