да json кодировать / декодировать не нужно, как указано выше $ data = (array) simplexml_load_string ($ xml);

лкивался с этой функцией преобразования объекта 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, но он по-прежнему не очень подходит для использования в качестве массива с многомерными массивами, т. Е. Зацикливанием.

Спасибо всем за любую помощь

 Dan Nissenbaum15 июл. 2014 г., 16:25
Этот вопрос мне понятен, поэтому я рекомендую открыть его снова.
 Halil Özgür20 мар. 2013 г., 17:40
Обратите внимание, что добавление(array) к вышесказанному (т.е.@json_decode(@json_encode((array)$simple_xml_object ), 1);), как отмечено в последующем комментарии в руководстве по PHP, это может привести кNode no longer exists ошибки.
 hakre08 июл. 2013 г., 09:31
о чем этот вопрос? json_encode выполняет обход дерева элемента simplexml. Что вы ожидали по-другому? Как вы определяете "немного хакерский"? Что не является надежным с таким подходом в ваших глазах? Что не эффективно?
 Karl Laurentius Roos29 мая 2011 г., 12:57
В чем причина? Это зацикливание? Потому что в этом случае у вас должна быть возможность зацикливать части объекта SimpleXMLElement без каких-либо проблем. Например, если вы анализируете ленту ATOM с помощью SimpleXML, вы сможете сделать следующее:foreach($xml->entry as $entry) а затем доступ$entry->title и т.д. из цикла.

Ответы на вопрос(2)

Решение Вопроса

Я нашел это в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.

 Gem16 нояб. 2018 г., 07:51
Возможно ли конвертировать объект в XML? @ Арьян
 Bo Pennings23 июл. 2014 г., 21:58
эта функция не работает рекурсивно. вот лучшая версия:stackoverflow.com/questions/2726487/...
 hakre08 июл. 2013 г., 10:09
@Arjan: Вы пропустили правильную атрибуцию правообладателей и автора. Я также добавил некоторые лицензионные теги docblock по удобным причинам. Пожалуйста, будьте осторожны, когда копируете примеры кода из руководства по PHP здесь на сайте. Они совместимы с лицензией, но требуют указания авторства. Поскольку CC специально не предназначены для программного обеспечения, примеры кода, скорее всего, не пригодны для использования в реальной жизни, их просто можно показать / объяснить. Если вы не приписываете и не скрываете правообладателей, это часто теряется.
 Halil Özgür20 мар. 2013 г., 17:24
Обратите внимание, что это не преобразует многомерные объекты в чистые массивы, то есть дочерние элементы все ещеSimpleXMLElements. Это потому чтоis_object($node) возвращаетсяfalse для дочерних объектов, т.е.gettype($node) внутри второй рекурсии"array", Более правильный методкомментарий чуть ниже, Второй метод имеет некоторые последствия для производительности при сравнении с первым (оригинальным) и с методом json:codepad.viper-7.com/eHhSNR, что делает метод JSON снова пригодным для использования с точки зрения производительности

Только что(array) отсутствует в вашем коде до объекта simplexml:

...

$xml   = simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA);

$array = json_decode(json_encode((array)$xml), TRUE);
                                 ^^^^^^^
...
 Monkey Monk16 сент. 2015 г., 12:26
Вам не нужно использоватьjson_**code, Просто используйте(object) (array) $xml и готово! ;-)
 Jake25 апр. 2018 г., 18:24
да json кодировать / декодировать не нужно, как указано выше $ data = (array) simplexml_load_string ($ xml);
 Monkey Monk28 дек. 2015 г., 10:42
@jmarceli Хороший вопрос и полезно знать! ;-) Тай!
 Wouter27 июл. 2015 г., 11:08
Содержание CDATA пропадает с этим подходом. Протестировано с PHP 5.5.21
 jmarceli24 дек. 2015 г., 14:06
@MonkeyMonk это верно только в том случае, если XML имеет «плоскую» структуру. ПРЕДУПРЕЖДЕНИЕ! с помощьюjson_** для получения массива будет давать разные результаты в зависимости от количества дочерних объектов (один против нескольких).

Ваш ответ на вопрос