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

php的foreach使用&引用数组最后一个元素的$value引用在foreach循环之后仍会保留该如何理解,不太明白。<?php$arr=array(1,2,3,4,5... 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,这个引用是怎么理解的。
展开
 我来答
阿刚炖蛋
2019-05-24 · TA获得超过3004个赞
知道大有可为答主
回答量:1789
采纳率:92%
帮助的人:991万
展开全部

你好!

这段代码中有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数组的值就变成了你给我罗列的值。
追答
是的,所以在使用指针变量后,要及时进行释放。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式