PHP foreach 一点细节

//非正常function getSonIDs(&$list, $fid = 0){    static $ids = array();    foreach($list as $id => $pid){        if($pid == $fid){            unset($list[$id]);             $ids[] = $id;            getSonIDs($list, $id);        }    }    return $ids;}

上个星期为CMS修改一个功能:需要获取所有后辈节点ID(不需要为树形结构),按照我的预想:已经判断为子节点的数据,就unset掉,但是 它的值已经被赋给$id, 了,所以并不会影响接下来的结果;

但是 代码却总在层数最低的节点 递归 回归的时候,就直接退出了

getSonIDs(&$list, 0)    getSonIDs(&$list, 1)        getSonIDs(&$list, 2)        getSonIDs(&$list, 3)     $pid){        if($pid == $fid){            //unset($list[$id]);            $ids[] = $id;            getSonIDs($list, $id);        }    }    return $ids;}
//测试/  树结构 */$tree = [    1 => [2,3],    4 => [5,6],    7 => [8,9],    10 => [11,12]];/  树线性结构 */$treeArr = [    1 => 0,    2 => 1,    3 => 1,    4 => 0,    5 => 4,    6 => 4,    7 => 0,    8 => 7,    9 => 7,    10 => 0,    11 => 10,    12 => 10];

(不要吐槽代码)(写得有点乱,不知道下次自己看还看不看得懂)

以自己微薄的C语言知识来猜测一下(应该就是这样) : foreach 赋值当前变量的时候,实际上 foreach->next 已经指向数组的下一个元素了,所以,在递归调用中中我 unset() 后,那里就为 null 了,所以,等递归栈收敛完成,回归,foreach 读取下一个元素,发现为null, 就退出了,实际上数组还有后继元素,只不过 foreach->next 所指向的东西已经被 unset了。

验证一下,把 $treeArr 打乱一下顺序

//测试/  树结构 */$tree = [    1 => [2,3],    4 => [5,6],    7 => [8,9],    10 => [11,12]];/  树线性结构 */$treeArr = [    2 => 1,    3 => 1,    4 => 0,    1 => 0,    4,    6 => 4,    7 => 0,    8 => 7,    9 => 7,    10 => 0,    11 => 10,    12 => 10];$return = [4,5,6,1,2,3,7,8,9]

key = 4 , next 指向 key=1 ,unset掉 5,6 , 对next 没有影响
然后 key = 1 next 指向 key=7 (5,6被删掉了) ,unset 掉 2,3 , 对next 没有影响
然后 进入 key=7 next 指向 key=8 ,unset掉 8,9 ,所以直接退出了

我都不知道我写得些什么鬼,

关键字:php, foreach, list, getsonids

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部