Как преобразовать многомерный массив в объект в php?

i имеет многомерный массив:

$image_path = array('sm'=>$sm,'lg'=>$lg,'secondary'=>$sec_image);

ведьма выглядит так:

[_media_path:protected] => Array
            (
                [main_thumb] => http://example.com/e4150.jpg
                [main_large] => http://example.com/e4150.jpg
                [secondary] => Array
                    (
                        [0] => http://example.com/e4150.jpg
                        [1] => http://example.com/e4150.jpg
                        [2] => http://example.com/e9243.jpg
                        [3] => http://example.com/e9244.jpg
                    )

            )

и я хотел бы преобразовать его в объект и сохранить имена ключей.

Любые идеи?

Спасибо

edit: $obj = (object)$image_path;, похоже, не работает. Мне нужен другой способ петли через массив и создание объекта

Ответ 1

Быстрый способ сделать это:

$obj = json_decode(json_encode($array));

Объяснение

json_encode($array) преобразует весь многомерный массив в строку JSON. (php.net/json_encode)

json_decode($string) преобразует строку JSON в объект stdClass. Если вы передадите TRUE в качестве второго аргумента в json_decode, вы получите ассоциативный массив. (php.net/json_decode)

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

Ответ 2

Лучшим способом было бы управлять структурой данных в качестве объекта с самого начала, если у вас есть возможность:

$a = (object) array( ... ); $a->prop = $value; //and so on

Но самым быстрым способом будет подход, предоставляемый @CharlieS, используя json_decode(json_encode($a)).

Вы также можете запустить массив через рекурсивную функцию, чтобы выполнить то же самое. Я не сравнивал это с подходом json, но:

function convert_array_to_obj_recursive($a) {
    if (is_array($a) ) {
        foreach($a as $k => $v) {
            if (is_integer($k)) {
                // only need this if you want to keep the array indexes separate
                // from the object notation: eg. $o->{1}
                $a['index'][$k] = convert_array_to_obj_recursive($v);
            }
            else {
                $a[$k] = convert_array_to_obj_recursive($v);
            }
        }

        return (object) $a;
    }

    // else maintain the type of $a
    return $a; 
}

Надеюсь, что это поможет.

EDIT: json_encode + json_decode создаст объект по желанию. Но если массив был числовым или смешанным индексом (например, array('a', 'b', 'foo'=>'bar')), вы не сможете ссылаться на числовые индексы с обозначением объекта (например, $o- > 1 или $o [1]). вышеуказанная функция помещает все числовые индексы в свойство "index", которое само является числовым массивом. поэтому вы могли бы сделать $o->index[1]. Это сохраняет различие преобразованного массива от созданного объекта и оставляет возможность объединить объекты, которые могут иметь числовые свойства.