我需要一个方法来遍历PHP中的多维数组而不使用函数调用。
基本上我有这样一个数组:
$data = array(
'hoge' => 123,
'foo' => 456,
'bar' => 789,
'aaa' => array(
'abc' => 111,
'bcd' => 222,
'cde' => 333
),
'bbb' => array(
'def' => array(
'efg' => 'hoge'
)
),
'stacks' => array(
'a',
'b'=> array('qwe' => 111,
'asd' => 222,
'args' => array('1',
'2',
'3')),
'c'
)
);
通常你使用这样的函数:
function get_array_elems($arrResult, $where="array"){
while(list($key,$value)=each($arrResult)){
if (is_array($value)){
get_array_elems($value, $where."[$key]");
}
} else {
...anything
}
}
get_array_elems($arrResult);
我无法使用此方法,因为我必须在PHP函数中编写此方法,并且它无法在另一个函数中编写函数。
可以使用迭代方法完成,例如while,foreach,array_walk_recursive等吗?
答案 0 :(得分:2)
array_walk_recursive
仍然可以使用。只需使用匿名函数:http://php.net/manual/en/functions.anonymous.php作为回调。您可以在其他函数中使用匿名函数,因此它应该适合您。确保您至少使用 PHP 5.3.0 ,因为那时会引入匿名函数。
答案 1 :(得分:1)
虽然我也看不出如何使用递归函数是不可能的,但作为编程练习它是一个有趣的。
如果你要模仿递归,你应该保留自己的堆栈以跟踪你在每个级别的位置,但这是一个真正的PITA,所以如果它们都一样,你最好先通过0,1级,按此顺序2等,并随时收集嵌套数组。 E.g:
function walk($walk)
{
while ( count($walk) > 0 )
{
$defer = array();
foreach ( $walk as $k=>$v )
{
if ( is_array($v) )
{
foreach ( $v as $kk=>$vv ) $defer["$k.$kk"] = $vv;
} else {
print "$k=>$v\n";
}
}
$walk = $defer;
}
}
但这显然与典型的递归解决方案具有不同的特征,这可能是也可能不是问题。