将SimpleXML对象转换为数组

我在这里遇到了将SimpleXML对象转换为数组的function:

/** * function object2array - A simpler way to transform the result into an array * (requires json module). * * This function is part of the PHP manual. * * The PHP manual text and comments are covered by the Creative Commons * Attribution 3.0 License, copyright (c) the PHP Documentation Group * * @author Diego Araos, diego at klapmedia dot com * @date 2011-02-05 04:57 UTC * @link http://www.php.net/manual/en/function.simplexml-load-string.php#102277 * @license http://www.php.net/license/index.php#doc-lic * @license http://creativecommons.org/licenses/by/3.0/ * @license CC-BY-3.0 <http://spdx.org/licenses/CC-BY-3.0> */ function object2array($object) { return json_decode(json_encode($object), TRUE); } 

所以我采用XMLstring就像:

 function xmlstring2array($string) { $xml = simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA); $array = json_decode(json_encode($xml), TRUE); return $array; } 

它工作得很好,但似乎有点哈克? 有没有一个更有效率/强大的方式来做到这一点?

我知道SimpleXML对象已经足够接近数组了,因为它使用了PHP中的ArrayAccess接口,但是它仍然不能很好地用作multidimensional array的数组,例如循环。

感谢所有的帮助

我在PHP手册中发现了这个评论 :

 /** * function xml2array * * This function is part of the PHP manual. * * The PHP manual text and comments are covered by the Creative Commons * Attribution 3.0 License, copyright (c) the PHP Documentation Group * * @author k dot antczak at livedata dot pl * @date 2011-04-22 06:08 UTC * @link http://www.php.net/manual/en/ref.simplexml.php#103617 * @license http://www.php.net/license/index.php#doc-lic * @license http://creativecommons.org/licenses/by/3.0/ * @license CC-BY-3.0 <http://spdx.org/licenses/CC-BY-3.0> */ function xml2array ( $xmlObject, $out = array () ) { foreach ( (array) $xmlObject as $index => $node ) $out[$index] = ( is_object ( $node ) ) ? xml2array ( $node ) : $node; return $out; } 

它可以帮助你。 但是,如果将XML转换为数组,则会丢失可能存在的所有属性,因此无法返回到XML并获取相同的XML。

Just (array)在你的代码中缺lesssimplexml对象:

 ... $xml = simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA); $array = json_decode(json_encode((array)$xml), TRUE); ^^^^^^^ ...