2014-03-27 132 views
0

我想遞歸地將一個php對象轉換爲數組。我寫的功能是這樣的:PHP遞歸轉換對象到數組

public function object_to_array($obj) { 
    $array = (array) $obj; 
    foreach ($array as $attribute) { 
     if (is_array($attribute)) $attribute = $this->object_to_array($attribute); 
     if (!is_string($attribute)) $attribute = (array) $attribute; 
    } 
    return $array; 
} 

但是,我仍然以我的外部數組中的對象結束。爲什麼是這樣?我的功能不正確?

+2

你沒有修改代碼中的任何東西 – zerkms

回答

2

你要檢查它是否是一個對象不是一個數組,雖然你可能會做兩種:

if (is_object($attribute) || is_array($attribute)) $attribute = $this->object_to_array($attribute); 
//I don't see a need for this 
//if (!is_string($attribute)) $attribute = (array) $attribute; 

而且從阿齊茲薩利赫,參考$attribute這樣你就可以修改它:

foreach ($array as &$attribute) { 
+0

第二部分檢查它是否是字符串是因爲我最終把它變成了json。如果它是一個字符串,我不需要進一步分割它。 – 735Tesla

+0

如果它不是一個字符串,你將它轉換爲一個數組(array)。所以整數,浮點數,布爾值將是一個數組。 – AbraCadaver

+0

我以爲我在說如果它不是一個字符串,然後將其轉換爲數組?不'''反轉條件? – 735Tesla

0

你需要做的:

foreach ($array as &$attribute) { 

這將讓屬性的改變,因爲你正在使用它作爲參考。

或者:

foreach ($array as $sub => $attribute) { 
    if (is_array($attribute)) $array[$sub] = $this->object_to_array($attribute); 
    if (!is_string($attribute)) $array[$sub] = (array) $attribute; 
} 

這將直接修改陣列子元件。我通常會選擇第二種解決方案,因爲它對我來說更加優雅。

0

你正在檢查is_array,當你應該檢查is_object時 - 如果它已經是一個數組,你可能不需要遞歸到函數中。您可以同時檢查兩個對象,以便對象數組也可以轉換。