我有一个像这样的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进行反转...但是当我尝试将对象插回到主结构中时,结果会被破坏/不完整
答案 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();