Я столкнулся с этой функцией преобразования объекта SimpleXML в массив здесь :
/** * 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); }
Поэтому мое принятие для строк XML выглядит так:
function xmlstring2array($string) { $xml = simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA); $array = json_decode(json_encode($xml), TRUE); return $array; }
Он работает очень хорошо, но кажется немного взломанным? Есть ли более эффективный / надежный способ сделать это?
Я знаю, что объект SimpleXML достаточно близок к массиву, потому что он использует интерфейс ArrayAccess в PHP, но он по-прежнему не очень удобен в использовании в качестве массива с многомерными массивами, т.е. с циклом.
Спасибо всем за любую помощь
Я нашел это в комментариях к 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.
Просто (array)
отсутствует в коде перед объектом simplexml:
... $xml = simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA); $array = json_decode(json_encode((array)$xml), TRUE); ^^^^^^^ ...