2011-06-21 3 views
0

Я хочу преобразовать xml-скрипт в ассоциативный массив в PHP. Сценарий XML является:преобразование xml в массив, неспособный обрабатывать узел внутри узла

<ages> 
    <Peter> 
     <Peterchild>4</Peterchild> 
     <Peterchild>6</Peterchild> 
    </Peter> 
    <Quagmire>30</Quagmire> 
    <Joe>34</Joe> 
</ages> 

и код я написал для преобразования его в массив является

${$xml->getName()} = array(); 
foreach($xml->children() as $child){ 
    $ages[$child->getName()] = (string)$child; 
} 

, который дает выход как

Array 
(
    [Peter] => 



    [Quagmire] => 30 
    [Joe] => 34 
) 

Проблема в том, что я не могу для выяснения условия рекурсивного прохождения через детей детей (детей Питера в этом примере). Как мне изменить этот код, чтобы рассмотреть эти узлы?

+0

Вы сказали волшебное слово, рекурсивно .... рекурсия. При текущем использовании вашего метода children() вам необходимо применить рекурсивную функцию для детализации и получения требуемых значений. Это или вы должны исследовать, есть ли другой метод просто превратить весь xml в массив или массив массивов, если это необходимо. – FinalForm

+1

См. 2 примера на этой странице: http://php.net/manual/en/class.simplexmliterator.php, оба делают то, что вам нужно. – Zyava

+0

@ Zyava спасибо, это помогло – rkt

ответ

0

Вам нужно будет создать функцию, которая анализирует один уровень, а затем вызовет функцию, когда найдет узел внутри текущего уровня. Это довольно сложно и может стать беспорядочным. Из любопытства, зачем вам это делать, когда вы можете получить доступ ко всей информации, необходимой в объектном формате, с помощью объекта SimpleXML?

0
${$xml->getName()} = array(); 
    foreach($xml->children() as $child) 
    { 
     if (count($child->children() > 0) 
     { 
     foreach ($child->children as $childnode) 
     { 
      $ages[$childnode->getName()] = (string)$childnode; 
     } 
     } 
     else { 
      $ages[$child->getName()] = (string)$child; 
     } 
    } 

Это будет работать, только если это один уровень глубоко, если он будет больше уровней вы должны написать функцию, которая будет цикл через него уровень за уровнем.

Смежные вопросы