如何在PHP中将多维数组转换为对象?

26

我有一个多维数组:

$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;似乎不起作用。 我需要一种不同的方式来循环遍历数组并创建对象。


你能给我们一个更好的例子,展示一下你想要的对象是什么样子吗?你想把键转换成属性吗?你需要这个对象有什么用途? - mpen
使用 -> 获取值,而不是使用 [] - Patrioticcow
2个回答

118

一个快速的方法是:

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

解释

json_encode($array)将整个多维数组转换为JSON字符串。(php.net/json_encode)

json_decode($string)将JSON字符串转换为stdClass对象。如果您在json_decode的第二个参数中传入TRUE,则会返回关联数组。 (php.net/json_decode)

我认为这里的性能与递归地遍历整个数组并转换内容相比没有明显差别,尽管我希望看到一些基准测试结果。它能正常工作,并且不会消失。


2
这应该是答案,因为 OP 想要整个多维数组,而不是顶层数组。 - AeroCross
2
我会说这是一种缓慢的方法。如果性能是一个问题,我会避免使用这个解决方案。 - Caleb Taylor
1
太棒了...谢谢。 - Nishant
2
我实际上使用php 7.2对这段代码进行了基准测试-> json_decodearray_map 或其他递归操作快5倍。此外,在php 5.4中,json_decode 解决方案是我能找到的最快选项。非常好的答案! - Philipp
1
@Mirceac21,你的对象可以实现JsonSerializable接口来定义如何转换它。 - Charlie Schliesser
显示剩余7条评论

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->1或$o [1])。上述函数将所有数字索引放入“index”属性中,该属性本身是数字数组。因此,您可以执行`$o->index [1]`。这保留了从转换的数组到创建的对象的区别,并保留了合并可能具有数值属性的对象的选项。

感谢您提供递归函数,我认为这对于很多在这方面遇到困难的人来说是非常有帮助的。我将查看PHP源代码,以比较json_encode/decode在性能方面的表现。我很好奇。 - Charlie Schliesser
4
您可以通过 $o->{1} 引用对象的数值属性。 - Charlie Schliesser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接