2012-02-07 127 views
10

我有一个多维数组:如何将多维数组转换为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;似乎并没有工作。我需要通过数组循环并创建对象的不同方式

+0

你能给我们一个更好的例子,你想要物体看起来像什么吗?你想把钥匙变成财产吗?为了什么目的,你需要一个对象? – mpen 2012-02-07 01:38:35

+0

而不是使用'[]'来获得我需要使用的值 - >' – Patrioticcow 2012-02-07 01:42:13

回答

71

一个快速的方法来做到这一点是:

$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

我不认为这里的表现vs递归通过数组和转换一切是非常明显的,虽然我想看到这个基准。它的工作原理,它不会消失。

+2

这应该是答案,因为OP需要整个多维数组,而不是顶层数组。 – AeroCross 2012-10-09 14:43:52

+1

我会说这是一个很慢的方法来做到这一点。如果性能是一个问题,我会避免这个解决方案。 – 2013-02-27 15:43:58

+0

@CalebTaylor - 我听到你。我不确定基准,但很好奇,如果迭代迭代多维数组并添加到对象(即手动完成整个事件)或简单地运行上述JSON技巧之间存在不小的差异。 – 2013-02-27 16:47:25

6

,最好的办法是管理你的数据结构,从一开始的对象,如果你有能力:

$a = (object) array(...); $a->prop = $value; //and so on 

但最快的方法是使用json_decode(json_encode($a))由@CharlieS提供的方法。

您也可以通过递归函数运行数组来完成相同的操作。我没有将这与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]。这保留了转换数组与被创建对象的区别,并保留了合并可能具有数字属性的对象的选项。

+0

感谢您提供递归函数,我认为这可能会有很多人偶然发现这一点。我将检查PHP源代码以查看json_encode/decode在性能方面的比较情况。我很好奇。 – 2013-12-23 04:40:58

+1

您可以通过'$ o - > {1}'引用对象的数值属性。 – 2014-02-04 15:35:19

相关问题