2012-07-30 132 views
0

我在PHP中有一個多維數組,希望能夠通過它搜索並查找所有屬於對象的值。在多維數組中搜索對象

我想這樣做的原因是,當發現一個對象時,我可以通過調用其上的output()方法來替換它。 output()方法使用get_object_vars()將自己變成一個數組,然後它返回。

下面是一個例子,其實現了什麼,我手動想要的(但只有2級深度):

// First level search... 
foreach($array as $k => $v) { 

    // Check if it's an array. 
    if (is_array($v)) { 

     // Second level search... 
     foreach($v as $k2 => $v2) { 

      // If it's an object - convert it! 
      if (is_object($v2)) { 
       $array[$k][$k2] = $array[$k][$k2]->output(); 
      } 

     } 

    } 

    // If it's an object - convert it! 
    if (is_object($v)) { 
     $array[$k] = $array[$k]->output(); 
    } 

} 

回答

0

Tim Cooper的回答是錯誤的,因爲該函數必須有一個參考值,而不是參考值。

php > class Foo { public function output() { return "this was an object"; } } 
php > $a = array(1 => array(2 => array('foo', 'red', 1, new Foo()))); 
php > array_walk_recursive($a, function($item, $key) { 
    if (is_object($item)) { 
     $item = $item->output(); 
    } 
}); 
php > print_r($a); 
Array 
(
    [1] => Array 
     (
      [2] => Array 
       (
        [0] => foo 
        [1] => red 
        [2] => 1 
        [3] => Foo Object 
         (
         ) 

       ) 

     ) 

) 

對戰引用傳遞:

php > array_walk_recursive($a, function(&$item, $key) { 
    if (is_object($item)) {    
     $item = $item->output(); 
    } 
}); 
php > print_r($a); 
Array 
(
    [1] => Array 
     (
      [2] => Array 
       (
        [0] => foo 
        [1] => red 
        [2] => 1 
        [3] => this was an object 
       ) 

     ) 
) 
+0

完美! Tim Cooper的回答揭示了我之後的功能(但我並不知道存在) - 並且你的回答已經調整了它以使其正常工作 - 謝謝! – 2012-07-30 11:31:43

0

你只需要一個遞歸函數:

function objects_to_arrays_recursive (&$array) { 
    foreach ($array as &$member) { 
    if (is_object($member)) { 
     $member = $member->output(); 
    } 
    if (is_array($member)) { 
     objects_to_arrays_recursive($member); 
    } 
    } 
} 

這將調用output()方法的每個對象並將結果存儲在原始保存該對象的鍵中。

注意事項

  • 這將循環一旦被轉換,並轉換子對象的對象。你可能不想這樣做,特別是如果你有循環引用,因爲這會導致一個無限循環。可以通過將2 if s更改爲if/elseif來避免。
  • 這不檢查給定對象是否有調用output()方法。您應該添加一個is_a()/instanceof檢查。
  • 該函數通過引用引用它的參數,這意味着輸入數組將被修改。如果您需要保持原始數組完好無損,則需要先複製它。