php的foreach使用&引用数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留

php的foreach使用&引用数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留该如何理解,不太明白。
<?php
$arr = array(1, 2, 3, 4, 5, 6);

foreach ($arr as &$value) {
$value = $value * 2;
}
print_r($arr);
echo "<br>";
// $arr is now array(2, 4, 6, 8,10,12)
//unset($value); // 最后取消掉引用
foreach ($arr as $value) {
echo $value."<br>";
}
?>
输出:
Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 10 [5] => 12 )
2
4
6
8
10
10

我不太明白$arr已经改变了,为啥我再次打印的时候最后一个跟倒数第二个都是10呢?为啥最后一个不是12,这个引用是怎么理解的。

你好!

这段代码中有2个foreach循环。产生这个结果的原因是引用变量没有进行释放造成的。

1. 第一个foreach循环,使用了&$value的写法,我们理解为指针变量,当循环结束后,
    它指向的是数组中最后一个元素,即$arr[5],此时它的值为12.
2. 第二个foreach循环,相当于每次循环都给$value进行赋值, 由于$value的引用没有释放,
    那么就是间接的为arr[5]进行赋值,它每次的循环结果如下:
    2,4,6,8,10,2
    2,4,6,8,10,4
    2,4,6,8,10,6
    2,4,6,8,10,8
    2,4,6,8,10,10

很好解决,就是在第一次foreach循环结束后,释放$value的引用,即unset($value);

希望对你有帮助!

追问

好的,我明白了,谢谢,你的意思是第二个foreach每次循环结束后,$arr数组的值就变成了你给我罗列的值。

追答

是的,所以在使用指针变量后,要及时进行释放。

温馨提示:答案为网友推荐,仅供参考