Мне нужно рекурсивно передать PHP SimpleXMLObject в массив. Проблема в том, что каждый дополнительный элемент также является элементом PHP SimpleXMLElement.
Это возможно?
json_decode(json_encode((array) simplexml_load_string($obj)), 1);
Не тестировал это, но, похоже, это делается:
function convertXmlObjToArr($obj, &$arr) { $children = $obj->children(); foreach ($children as $elementName => $node) { $nextIdx = count($arr); $arr[$nextIdx] = array(); $arr[$nextIdx]['@name'] = strtolower((string)$elementName); $arr[$nextIdx]['@attributes'] = array(); $attributes = $node->attributes(); foreach ($attributes as $attributeName => $attributeValue) { $attribName = strtolower(trim((string)$attributeName)); $attribVal = trim((string)$attributeValue); $arr[$nextIdx]['@attributes'][$attribName] = $attribVal; } $text = (string)$node; $text = trim($text); if (strlen($text) > 0) { $arr[$nextIdx]['@text'] = $text; } $arr[$nextIdx]['@children'] = array(); convertXmlObjToArr($node, $arr[$nextIdx]['@children']); } return; }
Возможно. Это рекурсивная функция, которая печатает теги родительских элементов и теги + содержимое элементов, у которых больше детей. Вы можете изменить его для построения массива:
foreach( $simpleXmlObject as $element ) { recurse( $element ); } function recurse( $parent ) { echo '<' . $parent->getName() . '>' . "\n"; foreach( $parent->children() as $child ) { if( count( $child->children() ) > 0 ) { recurse( $child ); } else { echo'<' . $child->getName() . '>'; echo iconv( 'UTF-8', 'ISO-8859-1', $child ); echo '</' . $child->getName() . '>' . "\n"; } } echo'</' . $parent->getName() . '>' . "\n"; }
Я не вижу смысла, поскольку SimpleXMLObject можно создавать так же, как и массивы …
Но если вам это действительно нужно, просто проверьте ответы на эту тему или этот пост на форуме.