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

У меня многомерный массив:

$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; похоже, не работает. Мне нужен другой способ петли через массив и создание объекта

Так просто как

 $obj = (object)$image_path; 

Смотрите в действии .

Для справки это описано здесь .

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

 $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 )

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

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

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