php - 这个递归算法哪里写错了,为什么打印出来的内容少了

查看:66
本文介绍了php - 这个递归算法哪里写错了,为什么打印出来的内容少了的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

get_child这个方法的$menu用了&$menu,然后方法里面使用 unset($menu[$key])就出问题了

    $menu=array(
       '120'=>array('module_id'=>'120','module_name'=>'系统','pid'=>0,'level'=>1),
       '121'=>array('module_id'=>'121','module_name'=>'系统','pid'=>0,'level'=>1),
       '122'=>array('module_id'=>'122','module_name'=>'系统','pid'=>121,'level'=>2),
       '123'=>array('module_id'=>'123','module_name'=>'系统','pid'=>122,'level'=>3),
         ...
         
    
    );
    $this->get_child('0', $menu, $data);
    echo '<pre>';
    var_dump($data);
    
    
    public function get_child($pid, &$menu, &$data) {

        foreach ($menu as $key => $value) {

            if ($value['pid'] == $pid) {
                if ($value['level'] == 2) {
                    $data[] = '|---' . $value['module_name'];
                } else if ($value['level'] == 3) {
                    $data[] = '    |---' . $value['module_name'];
                } else {
                    $data[] = $value['module_name'];
                }
                unset($menu[$key]);
                $this->get_child($value['module_id'], $menu, $data);
            }
        }
    }

解决方案

打印出来东西没少啊,这是我本地运行的结果

<pre>array(4) {
  [0]=>
  string(6) "系统"
  [1]=>
  string(6) "系统"
  [2]=>
  string(10) "|---系统"
  [3]=>
  string(14) "    |---系统"
}

  • 第一次循环pid=0并且level1,所以data添加了系统,并且递归调用了get_child(),但是没有任何itempid=120,所以执行下一次循环,
  • 此时是第二次循环,pid还是0并且level1,所以还是系统,这时候递归存在pid = 121,并且level =2 ,所以data添加|---系统,然后再次递归,
  • 这时pid=122并且level=3,所以data添加 |---系统,然后继续递归;
  • 这时候pid=123,但是没有pid是等于123的,然后继续for循环,pid=0,但此时再也没有pid=0的了,因为前面都unset掉了

这篇关于php - 这个递归算法哪里写错了,为什么打印出来的内容少了的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆