как преобразовать многомерный массив в объект в 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
)
)
И я хотел бы преобразовать его в объект и сохранить имена ключей.
Есть идеи?
Спасибо
Редактировать: $obj = (object)$image_path;
похоже, не работает. мне нужен другой способ обхода массива и создания объекта
2 answers
Быстрый способ сделать это:
$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;
}
Надеюсь, это поможет.
РЕДАКТИРОВАТЬ: json_encode + json_decode создаст объект по желанию. Но, если массив был числовыми или смешанными индексами (например, array('a', 'b', 'foo'=>'bar')
), вы не сможете ссылаться на числовые индексы с обозначением объекта (например, $o->1 или $o[1]). описанная выше функция помещает все числовые индексы в свойство "индекс", которое само по себе является числовым массивом. таким образом, вы могли бы сделать $o->index[1]
. Это сохраняет различие преобразованного массива от созданного объекта и оставляет возможность объединять объекты, которые могут иметь числовые свойства.