我有一个多维数组:
$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;
似乎不起作用。我需要一种不同的循环数组方式并创建一个对象
答案 0 :(得分:92)
快速执行此操作的方法是:
$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)
我不认为这里的性能与递归遍历数组并转换所有内容都非常明显,尽管我希望看到一些这方面的基准。它有效,而且不会消失。
答案 1 :(得分:7)
如果您有能力,最好的方法是从一开始就将数据结构作为对象进行管理:
$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-&gt; 1或$ o [1])。上面的函数将所有数字索引放入'index'属性中,该属性本身就是一个数值数组。那么,您就可以$o->index[1]
了。这样可以保持已转换数组与已创建对象的区别,并保留选项以合并可能具有数字属性的对象。