【问题标题】:how to convert multidimensional array to object in php?如何在php中将多维数组转换为对象?
【发布时间】:2012-02-28 12:07:37
【问题描述】:

我有一个多维数组:

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

【问题讨论】:

  • 你能给我们一个更好的例子来说明你希望对象是什么样子吗?你想把钥匙变成属性吗?你需要一个对象的目的是什么?
  • 而不是使用[]来获取我需要使用->的值

标签: php object multidimensional-array


【解决方案1】:

一个快速的方法是:

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

我不认为这里的性能与递归遍历数组并转换所有内容非常明显,尽管我希望看到一些基准测试。它有效,而且不会消失。

【讨论】:

  • 这应该是答案,因为 OP 想要整个多维数组,而不是顶级数组。
  • 我会说这是一种缓慢的方法。如果性能是一个问题,我会避免这个解决方案。
  • 太棒了……谢谢。
  • 我实际上用 php 7.2 对这段代码进行了基准测试 -> json_decodearray_map 或其他递归操作快 5 倍。同样在 php 5.4 中,json_decode 解决方案是我能找到的最快的选择。很好的答案!
  • @Mirceac21 您的对象可以实现JsonSerializable 来定义它的转换方式。
【解决方案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 将根据需要创建一个对象。但是,如果数组是数字索引或混合索引(例如 array('a', 'b', 'foo'=>'bar') ),您将无法使用对象表示法(例如 $o->1 或 $o[1])引用数字索引。上述函数将所有数字索引放入“index”属性中,该属性本身就是一个数字数组。所以,你就可以做到$o->index[1]。这样可以区分转换后的数组与创建的对象,并留下合并可能具有数字属性的对象的选项。

【讨论】:

  • 感谢您提供递归函数,我认为这可能对许多偶然发现此问题的人有所帮助。我将检查 PHP 源代码以了解 json_encode/decode 在性能方面的比较。我很好奇。
  • 您可以通过$o->{1}引用对象的数值属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 2021-12-28
  • 2016-11-28
相关资源
最近更新 更多