2012-02-07 123 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

相關問題