Php 不会在递归 foreach 循环中中断

标签 php recursion foreach return break

我有一个递归函数,如下所示。

public function findnodeintree($cats,$cat_id)
{       
    foreach($cats as $node)
    {                   
        if((int)$node['id'] == $cat_id)
        {       
            echo "finded";
            $finded = $node;
            break;
        }
        else
        {
            if(is_array($node) && array_key_exists('children', $node)){ 
                $this->findnodeintree($node['children'],$cat_id);
            }
        }           
    }
    return $finded;
}

例如

$node =$this->findnodeintree($category_Array, 169);

它给了我

"founded"

遇到 PHP 错误

Severity: Notice

Message: Undefined variable: finded

数组结构是这样的

    [0] => Array
    (
        [id] => 0
        [name] => MAIN CATEGORY
        [depth] => 0
        [lft] => 1
        [rgt] => 296
        [children] => Array
            (
                [0] => Array
                    (
                        [id] => 167
                        [name] =>  CAT 0
                        [depth] => 1
                        [lft] => 2
                        [rgt] => 17
                        [children] => Array
                            (
                                [0] => Array
                                    (
                                        [id] => 169
                                        [name] =>   CAT 1
                                        [depth] => 2
                                        [lft] => 3
                                        [rgt] => 4
                                    )

                                [1] => Array
                                    (
                                        [id] => 170
                                        [name] =>   CAT 2
                                        [depth] => 2
                                        [lft] => 5
                                        [rgt] => 10
                                        [children] => Array
                                            (
                                                [0] => Array
                                                    (
                                                        [id] => 171
                                                        [name] =>    CAT 5
                                                        [depth] => 3
                                                        [lft] => 6
                                                        [rgt] => 7
                                                    )

                                                [1] => Array
                                                    (
                                                        [id] => 172
                                                        [name] =>    CAT 3
                                                        [depth] => 3
                                                        [lft] => 8
                                                        [rgt] => 9
                                                    )

                                            )

                                    )

最佳答案

要从递归中获取正确的值,您的递归调用不得丢弃返回值。并且由于您希望在命中后立即返回递归树,并实际返回匹配的节点,因此您也必须在该点中断循环。

否则后续的递归调用会覆盖您的变量并返回错误的节点、falsenull

这应该是有效的:

public function findnodeintree($cats,$cat_id)
{       
    foreach($cats as $node)
    {                   
        if((int)$node['id'] == $cat_id){       
            return $node;
        }
        elseif(array_key_exists('children', $node)) {
            $r = $this->findnodeintree($node['children'], $cat_id);
            if($r !== null){
                return $r;
            }
        }           
    }
    return null;
}

注意:我删除了 is_array,因为此时 $node 必须是一个数组,否则会在第一个分支条件下抛出错误。

关于Php 不会在递归 foreach 循环中中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14584726/

相关文章:

php mail() 验证问题。不显示警报,而是打开 php 表单

php - CodeIgniter session 错误

c# - foreach 和 linq 查询 - 需要帮助尝试理解

c++ - 有没有办法在 C++ 中为基于范围的 for 循环设置偏移量?

c++ - 计算 (2^k)m=input 的递归函数

php - 相当于 mysql 结果的 each(),以模仿 foreach() 的第一个循环

php - 使用 php Access MDB

php - 对使用 proc_open 打开的进程进行多次写入

c++ - 如何优化我的 Langford 序列函数?

c++ - C++ 标准文档说程序不应调用 main 函数,但我做到了