Как преобразовать SimpleXMLObject в PHP-массив?

Рассмотрим следующий код:

$string = '<device> <id>1234</id> <label>118</label> <username>root</username> <password>helloWorld</password> <hardware> <memory>4GB RAM</memory> <storage_drives> <storage_drive_1>2TB SATA 7,200RPM</storage_drive_1> <storage_drive_2>1TB SATA 7,200RPM</storage_drive_2> <storage_drive_3>Not Applicable</storage_drive_3> <storage_drive_4>Not Applicable</storage_drive_4> </storage_drives> </hardware> </device>'; $xml = new SimpleXMLElement($string); $deviceDetails = Array(); foreach($xml as $element){ $tag = $element->getName(); $deviceDetails += Array($tag => '$element->$tag)', ); } 

Результат $detailsDetails array выглядит следующим образом:

 Array ( [id] => $element->$tag) [label] => $element->$tag) [username] => $element->$tag) [password] => $element->$tag) [hardware] => $element->$tag) ) 

что неправильно.

Мой вопрос: как заставить $element->$tag работать?

Код книги Zeus, завернутый в функцию, чтобы заставить его работать рекурсивно:

 function xml2array($xml) { $arr = array(); foreach ($xml as $element) { $tag = $element->getName(); $e = get_object_vars($element); if (!empty($e)) { $arr[$tag] = $element instanceof SimpleXMLElement ? xml2array($element) : $e; } else { $arr[$tag] = trim($element); } } return $arr; } $xml = new SimpleXMLElement($string); print_r(xml2array($xml)); Array ( [id] => 1234 [label] => 118 [username] => root [password] => helloWorld [hardware] => Array ( [memory] => 4GB RAM [storage_drives] => Array ( [storage_drive_1] => 2TB SATA 7,200RPM [storage_drive_2] => 1TB SATA 7,200RPM [storage_drive_3] => Not Applicable [storage_drive_4] => Not Applicable ) ) ) 

Попробуй это:

 $string = '<device> <id>1234</id> <label>118</label> <username>root</username> <password>helloWorld</password> <hardware> <memory>4GB RAM</memory> <storage_drives> <storage_drive_1>2TB SATA 7,200RPM</storage_drive_1> <storage_drive_2>1TB SATA 7,200RPM</storage_drive_2> <storage_drive_3>Not Applicable</storage_drive_3> <storage_drive_4>Not Applicable</storage_drive_4> </storage_drives> </hardware> </device>'; $xml = json_decode(json_encode((array) simplexml_load_string($string)), 1); 

Это приведет к выводу:

 Array ( [id] => 1234 [label] => 118 [username] => root [password] => helloWorld [hardware] => Array ( [memory] => 4GB RAM [storage_drives] => Array ( [storage_drive_1] => 2TB SATA 7,200RPM [storage_drive_2] => 1TB SATA 7,200RPM [storage_drive_3] => Not Applicable [storage_drive_4] => Not Applicable ) ) ) 

или если вам это не нравится, вы можете использовать класс PHP, например: http://www.bin-co.com/php/scripts/xml2array/

или просмотреть dfsq ответ

Попробуй это:

 $array = json_decode(json_encode((array)$xml), TRUE);