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