PHP中遍历多维数组的递归方法
我需要一个方法来遍历PHP中的多维数组,而不使用函数调用本身 基本上我有这样一个数组:PHP中遍历多维数组的递归方法,php,algorithm,arrays,traversal,Php,Algorithm,Arrays,Traversal,我需要一个方法来遍历PHP中的多维数组,而不使用函数调用本身 基本上我有这样一个数组: $data = array( 'hoge' => 123, 'foo' => 456, 'bar' => 789, 'aaa' => array( 'abc' => 111, 'bcd' => 222, 'cde' => 333 ), 'bbb' => array(
$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);
通常使用如下函数:
$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\u walk\u recursive等迭代方法来完成吗?
array\u walk\u recursive
仍然可以工作。只需使用匿名函数:作为回调。您可以在其他函数中使用匿名函数,因此它应该适合您。只需确保您至少使用了PHP5.3.0,因为匿名函数就是在这个时候引入的。虽然我也不知道如何使用递归函数是不可能的,但作为一个编程练习,这是一个有趣的例子
如果要模拟递归,应该保留自己的堆栈以跟踪在每个级别中的位置,但这是一个真正的PITA,因此如果都是相同的,那么最好先按顺序遍历级别0、1、2等,然后收集嵌套数组。例如:
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;
}
}
但这显然与典型的递归解决方案有不同的特点,这可能是个问题,也可能不是问题。我可以问一下,为什么不能在函数内部使用函数调用吗?如果你想有一个迭代的方法,我不会把递归放在问题的标题里。哇,每次我读这些东西的时候都会学到一些新的东西。我没有意识到PHP使用了一个非。函数。太棒了!小心。。。匿名函数直到PHP5.3.0才被引入。