2012-07-30 151 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检查。
  • 该函数通过引用引用它的参数,这意味着输入数组将被修改。如果您需要保持原始数组完好无损,则需要先复制它。