gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:56:49 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com