¿Cuál es la mejor función php DOM 2 Array?

Quiero analizar archivos xml. La mejor manera que encontré es utilizar la clase DOMDocument () hasta ahora.

cadena de muestra xml:

           

Uso la función dom2array (abajo) para analizar el dom, pero solo devuelve 1 elemento (valor 4 solamente)

 nodeType == XML_TEXT_NODE){ $res = $node->nodeValue; }else{ if($node->hasAttributes()){ $attributes = $node->attributes; if(!is_null($attributes)){ $res['@attributes'] = array(); foreach ($attributes as $index=>$attr) { $res['@attributes'][$attr->name] = $attr->value; } } } if($node->hasChildNodes()){ $children = $node->childNodes; for($i=0;$ilength;$i++){ $child = $children->item($i); $res[$child->nodeName] = dom2array($child); } } } return $res; } ?> 

¿Hay alguna forma de analizar todos los elementos xml y enviarlos a una matriz?

matriz de salida:

 Array ( [response] => Array ( [#text] => [resData] => Array ( [#text] => [contact:infData] => Array ( [#text] => [contact:status] => Array ( [@attributes] => Array ( [s] => value4 ) ) ) ) ) ) 

¿Dónde está value1, value2, value3? 🙁 Gracias

Puede usar esto (basado en: http://php.net/manual/en/book.dom.php#93717 );

 function xml_to_array($root) { $result = array(); if ($root->hasAttributes()) { $attrs = $root->attributes; foreach ($attrs as $attr) { $result['@attributes'][$attr->name] = $attr->value; } } if ($root->hasChildNodes()) { $children = $root->childNodes; if ($children->length == 1) { $child = $children->item(0); if ($child->nodeType == XML_TEXT_NODE) { $result['_value'] = $child->nodeValue; return count($result) == 1 ? $result['_value'] : $result; } } $groups = array(); foreach ($children as $child) { if (!isset($result[$child->nodeName])) { $result[$child->nodeName] = xml_to_array($child); } else { if (!isset($groups[$child->nodeName])) { $result[$child->nodeName] = array($result[$child->nodeName]); $groups[$child->nodeName] = 1; } $result[$child->nodeName][] = xml_to_array($child); } } } return $result; } 

Prueba;

 $s = '          '; $xml = new DOMDocument(); $xml->loadXML($s); $xmlArray = xml_to_array($xml); print_r($xmlArray); // print_r($xmlArray['response']['resData']['contact:infData']['contact:status'][0]['@attributes']['s']); // foreach ($xmlArray['response']['resData']['contact:infData']['contact:status'] as $status) { // echo $status['@attributes']['s'] ."\n"; // }