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

2022-08-30 17:55:53

我有一个多维数组:

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


答案 1

执行此操作的快速方法是:

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

解释

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

json_decode($string)将 JSON 字符串转换为对象。如果作为 第二个参数传入 ,则会得到一个关联数组。(php.net/json_decodestdClassTRUEjson_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; 
}

希望有所帮助。

编辑:json_encode + json_decode将根据需要创建一个对象。但是,如果数组是数字或混合索引(例如。 ),您将无法使用对象表示法引用数字索引(例如$o->1或$o[1])。上述函数将所有数字索引放入“index”属性中,该属性本身就是一个数字数组。因此,您将能够执行.这将保持转换后的数组与创建的对象之间的区别,并保留合并可能具有数值属性的对象的选项。array('a', 'b', 'foo'=>'bar')$o->index[1]


推荐