PHP - рекурсивный массив для объекта? - PullRequest
34 голосов
/ 25 января 2011

Есть ли способ преобразовать многомерный array в stdClass объект в PHP?

Преобразование в (object), похоже, не работает рекурсивно. json_decode(json_encode($array)) дает результат, который я ищу, но должен быть лучший способ ...

Ответы [ 14 ]

0 голосов
/ 13 сентября 2016

Самое короткое, что я мог придумать:

array_walk_recursive($obj, function (&$val) { if (is_object($val)) $val = get_object_vars($val); });
0 голосов
/ 22 февраля 2016

Вот плавный способ сделать это, который может обрабатывать ассоциативный массив с большой глубиной и не переписывать свойства объекта, которых нет в массиве.

    <?php

    function setPropsViaArray( $a, $o )
    {
        foreach ( $a as $k => $v )
        {
            if ( is_array( $v ) )
            {
                $o->{$k} = setPropsViaArray( $v, ! empty ( $o->{$k} ) ? $o->{$k} : new stdClass() );
            }
            else
            {
                $o->{$k} = $v;
            }
        }
        return $o;
    };

    setPropsViaArray( $newArrayData, $existingObject );
0 голосов
/ 26 февраля 2014

РЕДАКТИРОВАНИЕ: Эта функция является преобразованием из объекта в массив.

Из https://forrst.com/posts/PHP_Recursive_Object_to_Array_good_for_handling-0ka

protected function object_to_array($obj)
{
    $arrObj = is_object($obj) ? get_object_vars($obj) : $obj;
    foreach ($arrObj as $key => $val) {
            $val = (is_array($val) || is_object($val)) ? $this->object_to_array($val) : $val;
            $arr[$key] = $val;
    }
    return $arr;
}
0 голосов
/ 28 января 2013

Вот функция для глубокого преобразования массива в объект на месте, использующего внутренний (неглубокий) механизм приведения типов массива к объекту в PHP. Он создает новые объекты только при необходимости, сводя к минимуму дублирование данных.

function toObject($array) {
    foreach ($array as $key=>$value)
        if (is_array($value))
            $array[$key] = toObject($value);
    return (object)$array;
}

Предупреждение - не используйте этот код, если существует риск получения циклических ссылок.

...