【问题标题】:A recursive method to traverse a multi-dimensional array in PHPPHP中遍历多维数组的递归方法
【发布时间】:2010-07-14 23:42:00
【问题描述】:

我需要一种在 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等迭代方法来完成吗?

【问题讨论】:

  • 请问为什么不能在函数内部使用函数调用?如果您想采用迭代方法,我不会将 recursive 放入问题的标题中。

标签: php algorithm arrays traversal


【解决方案1】:

array_walk_recursive 仍然可以使用。只需使用匿名函数:http://php.net/manual/en/functions.anonymous.php 作为回调。您可以在其他函数中使用匿名函数,因此它应该适合您。只要确保您至少使用 PHP 5.3.0,因为那是引入匿名函数的时候。

【讨论】:

  • 哇,每次阅读 SO 时都会学到一些新东西。我没有意识到 PHP 使用了 anon。职能。太棒了!
  • 请注意...直到 PHP 5.3.0 才引入匿名函数。
【解决方案2】:

虽然我也看不出使用递归函数是不可能的,但作为一项编程练习,它是一个有趣的练习。

如果你要模拟递归,你应该保留自己的堆栈来跟踪你在每个级别中的位置,但这是一个真正的 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;
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-18
    • 2016-06-05
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多