foreach循环数组时结果不对

先看一段代码

    $array = [1, 2, 3, 4];
    foreach ($array as &$value) {
        echo $value;
    }
    foreach ($array as $value) {
        echo $value;
    }

猜一下输出结果是

12341234 还是 别的

结果是

php7以上是: 12341233
php7以下是: 12341234

相关文档:
php官方关于foreach的文档

多看文档!!!
多看文档!!!
多看文档!!!
(打自己三个大嘴巴子)
  

解释下:

出现这种情况是:
在第一个foreach中,每次的循环都相当于:

$value = &$arr[$i]; // $i 是$arr的索引

第一个foreach完成后,$value并没有注销掉,到第二个foreach时,每次的循环都相当于:

$value = $arr[$i]; // $i 是$arr的索引

$value在
第一个foreach结束被定义为最后一个引用值$value = &$array[3]
第二个foreach运行到$i=2时$array[3]会是$array[2]的值, 运行到$3时,自己等于自己所以不会有变化
运行结束后 $array就会变成 [1, 2, 3, 3]

测试一下是否真的懂了:

    $array = [1, 2, 3, 4];
    foreach ($array as &$value) {
        echo $value;
    }
    foreach ($array as $value) {
        echo $value;
        break;
    }

在php7以上运行结果是 12341,但是$array 会变成 [1, 2, 3, 1]

结论

在foreach遍历数组时如用到&,在foreach结束时使用unset清除引用,在本例中的正确姿势:

    $array = [1, 2, 3, 4];
    foreach ($array as &$value) {
        echo $value;
    }
    unset($value)    // 重点,考试要考
    foreach ($array as $value) {
        echo $value;
    }

发表评论

电子邮件地址不会被公开。 必填项已用*标注