0

这是一个父级和子级分类的递归方法,自己写的,
但是到了最后判断完剩余数组为空的时候,return保存好的数组$arr_comments,结果又会继续循环,
但是如果dd打印$arr_comments = []数组,则会正确的输出.
laravel的框架写的

    public static function foreachComments($comments, $arr_id = array(0), $arr_comments = [])
    {
        $arr = $comments;
        $s_comments = &$arr;
//        //一个全局的变量 保存循环出来的数组,
//        //一个全局的ID变量数组,保存每次循环出来的数组的ID
        foreach ($comments as $key => $value) {
            $a = $value->father_id;
            //数组取值为空??!!
            $b = $arr_id[count($arr_id) - 1];
            if ($a == $b) {
                $arr_comments[count($arr_comments)] = $comments[$key];
                $arr_id[count($arr_id)] = $value->id;
                $s_comments = array_except($comments, $key);
                self::foreachComments($s_comments, $arr_id, $arr_comments);
            }

        }

        $arr_id = array_except($arr_id, count($arr_id) - 1);
        if (count($arr)==0) {
            dd($arr_comments);
        }
        self::foreachComments($s_comments, $arr_id, $arr_comments);
    }

2个回答

1

已采纳

函数return 后会把执行权交给函数调用处.

参考资料:http://php.net/manual/zh/func...

    public static function foreachComments($comments, $arr_id = array(0), $arr_comments = [])
    {
        $arr = $comments;
        $s_comments = &$arr;
//        //一个全局的变量 保存循环出来的数组,
//        //一个全局的ID变量数组,保存每次循环出来的数组的ID
        foreach ($comments as $key => $value) {
            $a = $value->father_id;
            //数组取值为空??!!
            $b = $arr_id[count($arr_id) - 1];
            if ($a == $b) {
                $arr_comments[count($arr_comments)] = $comments[$key];
                $arr_id[count($arr_id)] = $value->id;
                $s_comments = array_except($comments, $key);
                self::foreachComments($s_comments, $arr_id, $arr_comments);//这里也是在调用自身
            }

        }

        $arr_id = array_except($arr_id, count($arr_id) - 1);
        if (count($arr)==0) {
            dd($arr_comments);//在这里return后会继续往下执行...
        }
       self::foreachComments($s_comments, $arr_id, $arr_comments);//这里也是在调用自身
    }

dd函数是终止程序并打印结果,所以你用DD当然可以打印出结果啊..

dd相当于var_dump();die;

0

把最后的递归函数放到else里面,就可以了。
这个问题主要是,如果你的return是在递归里面的执行的话,那这个return只是终止了递归的函数的运行,主函数并没有停止,还要继续往下运行的。所以会再继续运行一次最后的那个递归的。

撰写答案