资讯专栏INFORMATION COLUMN

PHP foreach 一点细节

Soarkey / 3022人阅读

摘要:验证一下,把打乱一下顺序测试树结构树线性结构第一个栏目调换到这里指向掉,对没有影响然后指向,被删掉了,掉对没有影响然后进入指向掉,所以直接退出了我都不知道我写得些什么鬼,

//非正常
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
];

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

以自己微薄的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,   <- 第一个栏目调换到这里
    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 ,所以直接退出了

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21660.html

相关文章

  • PHP细节foreach、(汉子)字符串反转、isset,empty用法区别以及0、‘’、null

    摘要:规定要反转的字符串。参考文档实现字符串翻转包含中文汉字参考处理汉字官方文档函数最下面给出了支持的方案三用法区别以及之间关系用法如果是非空或非零的值,则返回。若想检测常量是否已设置,可使用函数。 一、foreach 第一题: //1.for循环执行几次 //for($i=0;$i=1;$i++){ // echo $i; //} $i==1条件很成立,死循环 for($i=0;$...

    孙淑建 评论0 收藏0
  • 十个 PHP 开发者最容易犯的错误

    摘要:这种行为比最初出现的问题更为棘手,同时也是一种常见的错误源。这意味着这个数组的一份拷贝将会被返回,因此被调函数与调用者所访问的数组并不是同样的数组实例。 showImg(https://segmentfault.com/img/bV7reP?w=620&h=620); PHP 语言让 WEB 端程序设计变得简单,这也是它能流行起来的原因。但也是因为它的简单,PHP 也慢慢发展成一个相对...

    fireflow 评论0 收藏0
  • PHP 自 5.2 到 5.6 中新增的功能详解

    摘要:本文将会介绍自起,直至中增加的新特征。弃用的功能以下几个功能被弃用,若在配置文件中启用,则会在运行时发出警告。该类的完整限定名是其中第一个反斜杠表示全局命名空间。目的在于模仿的不对,目的是为了让发布应用程序更加方便。 截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5...

    番茄西红柿 评论0 收藏0
  • Badoo 告诉你切换到 PHP7 节省了 100 万美元

    摘要:我们为了处理这些挑战,提出了一个新的引用测试框架当然,也是开源的,并且在整个过程中节省了上百万美元。另一方面,被证实有一些严重的缺点部署困难而且慢。在缓存刷新期间,当可用于别的进程的已缓存的文件字节码在此时损坏,就会导致崩溃。 How Badoo saved one million dollars switching to PHP7 我们成功的把我们的应用迁移到了php7上面(数百台机...

    biaoxiaoduan 评论0 收藏0
  • 当我们使用foreach时,内部究竟发生了什么(PHP5)?

    摘要:如何证明我的说法呢可以用下面这段代码检验。那么在这里我们需要特别注意,为了保险起见我们在遍历数组后,最好手动一下数组,防止出错这样就正常了。还有一点手册也提醒我们了转成代码的意思就是遍历后和是真实存在的,最好使用后能手动掉。 以下所有结论均基于PHP5版本看下面一段最基础的foreach遍历数组代码。 输出为’0a1b2c’自然没有疑问,那么此过程中$arr,$key,$valu...

    paulli3 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<