在PHP中遍历多维数组的递归方法

时间:2010-07-14 23:42:01

标签: php algorithm arrays traversal

我需要一个方法来遍历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等吗?

2 个答案:

答案 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;
    }
}

但这显然与典型的递归解决方案具有不同的特征,这可能是也可能不是问题。