//非正常 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) <- 老是在这一步执行以后就直接退出了 getSonIDs(&$list, 4)
//正常 function getSonIDs($list, $fid = 0){ static $ids = array(); static $count = 0; foreach($list as $id => $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 ];
(不要吐槽代码)(写得有点乱,不知道下次本身看还看不看得懂)code
以本身微薄的C语言知识来猜想一下(应该就是这样) : foreach 赋值当前变量的时候,实际上 foreach->next 已经指向数组的下一个元素了,因此,在递归调用中中我 unset() 后,那里就为 null 了,因此,等递归栈收敛完成,回归,foreach 读取下一个元素,发现为null, 就退出了,实际上数组还有后继元素,只不过 foreach->next 所指向的东西已经被 unset了。递归
验证一下,把 $treeArr 打乱一下顺序get
//测试 /** 树结构 */ $tree = [ 1 => [2,3], 4 => [5,6], 7 => [8,9], 10 => [11,12] ]; /** 树线性结构 */ $treeArr = [ 2 => 1, 3 => 1, 4 => 0, 1 => 0, <- 第一个栏目调换到这里 5 => 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 ,因此直接退出了io
我都不知道我写得些什么鬼,function