Преобразование многомерного многообъектного массива в стандартный многомерный массив в PHP

У меня есть многомерный многообъектный массив из вызова функции simplexml_import_dom().

Срез одной секции массива:

[Price] => SimpleXMLElement Object
(
    [Prices] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [MType] => A
                            [PType] => R

Это вызывает у меня немало проблем при попытке чтения вложенных объектов. Я попытался перебрать массив, используя несколько get_object_vars(), но поскольку глубина и расположение вложенных объектов постоянно меняются, я не смог получить желаемых результатов.

Содержит ли PHP функцию, которую я не смог найти, для преобразования многомерного массива с несколькими объектами в стандартный многомерный массив? Или кто-нибудь уже решал эту проблему?

Спасибо за вашу помощь!


person user103219    schedule 27.11.2009    source источник
comment
Может быть, у вас есть что-то конкретное, что вам нужно сделать? Это кажется не «проблемой», которую нужно решить, а скорее рецептом, который нужно открыть.   -  person Don    schedule 27.11.2009


Ответы (2)


Этот вопрос часто задают, но есть фундаментальная проблема, которую необходимо решать в каждом конкретном случае при преобразовании XML-дерева в массив, что делает невозможным универсальный метод: как вы различаете узлы из атрибутов?

Например, как бы вы преобразовали этот XML в массив:

<node val="attr"><val>child</val></node>

Кроме того, у узла может быть любое количество дочерних элементов с одинаковым именем, что нельзя эмулировать с помощью ассоциативного массива.

Короче говоря, вам придется приготовить собственное решение. Судя по вашему выводу, это будет выглядеть примерно так:

$arr = array();
foreach ($Price->Prices as $Prices)
{
    $tmp = array();

    foreach ($Prices->attributes() as $k => $v)
    {
        $tmp[$k] = (string) $v;
    }

    $arr[] = $tmp;
}

Если это не то, что вы ищете, отредактируйте свой вопрос и добавьте пример исходного документа (XML), а также ожидаемый результат (массив).

person Josh Davis    schedule 27.11.2009

Знаете ли вы, что у этих объектов есть функции, которые вы можете использовать? Попробуйте следующее:

foreach ($simpleXmlObject->children() as $element) {
    echo $element->getName();
}
person soulmerge    schedule 27.11.2009
comment
Мне почему-то не пришло в голову попробовать. Я попробую это и опубликую свои результаты. - person user103219; 27.11.2009