Рассмотрим следующий код:
$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);