在多维数组中搜索对象

时间:2012-07-30 11:08:08

标签: php arrays object recursion multidimensional-array

我在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();
    }

}

2 个答案:

答案 0 :(得分: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()方法,并将结果存储在最初保存该对象的键中。

注意事项

  • 这将在对象转换后循环它们并转换子对象。您可能不想这样做,特别是如果您有循环引用,因为这会导致infinte循环。只需将2 if更改为if / elseif
  • 即可避免此问题
  • 这不会检查给定对象是否有output()方法来调用。您应该添加is_a() / instanceof支票。
  • 此函数通过引用获取其参数,这意味着将修改输入数组。如果您需要保持原始数组的完整性,则需要先复制它。

答案 1 :(得分: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
                )

        )
 )