2012-11-18 102 views
0

我有SimpleXML对象这样如何颠倒simplexmlelement列表的顺序?

<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

“但是当我尝试插入的对象回到主结构,结果是坏了/不完整的” - 这阐述 – zerkms

+0

你看着XSLT? –

回答

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.

+0

太棒了!我一直在尝试使用混合解决方案,但我对dom扩展非常不满......非常感谢。 – SimonQuest