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

}
4

2 回答 2

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 ifs更改为 s 即可避免if / elseif
  • 这不会检查给定对象是否有output()要调用的方法。您可能应该添加is_a()/instanceof检查。
  • 此函数通过引用获取其参数,这意味着将修改输入数组。如果您需要保持原始数组完好无损,则需要先复制它。
于 2012-07-30T11:11:18.427 回答
0

蒂姆库珀的回答是错误的,因为函数必须有一个通过引用而不是值传递的参数。

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
                )

        )
 )
于 2012-07-30T11:23:55.870 回答