Конвертировать многомерный массив из нескольких объектов в стандартный многомерный массив в PHP - PullRequest
4 голосов
/ 27 ноября 2009

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

Срез одного раздела массива:

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

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

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

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

Ответы [ 2 ]

1 голос
/ 27 ноября 2009

Этот вопрос часто задают, но есть фундаментальная проблема, которую необходимо решать в каждом конкретном случае при преобразовании дерева 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), а также ожидаемый результат (массив.)

1 голос
/ 27 ноября 2009

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

foreach ($simpleXmlObject->children() as $element) {
    echo $element->getName();
}
...