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数组的值就变成了你给我罗列的值。

追答

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

温馨提示:内容为网友见解,仅供参考
无其他回答

php的foreach使用&引用数组最后一个元素的 $value 引用在 foreach 循...
你好!这段代码中有2个foreach循环。产生这个结果的原因是引用变量没有进行释放造成的。1. 第一个foreach循环,使用了&$value的写法,我们理解为指针变量,当循环结束后, 它指向的是数组中最后一个元素,即$arr[5],此时它的值为12.2. 第二个foreach循环,相当于每次循环都给$value进行赋值, ...

深入理解PHP中的foreach
最后一个元素的$value引用在foreach循环后仍保留。引用循环时,数组修改会影响循环。在处理引用传递时,如果在函数中使用unset()销毁变量,仅销毁局部变量,原数组值不受影响。例如:输出结果:Array ( [0] => 3 [1] => 4 [2] => 5 ), Array ( [0] => 3 [1] => 4 [2] => 4 )...

PHP中的函数-- foreach()的用法详解
value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 key。自PHP 5 起,还可能遍历对象。注意:当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在 foreach 循环之前调用 ...

PHP语言中 foreach 遍历数组用法
自 PHP 5 起,可以很容易地通过在 $b 之前加上 & 来修改数组的单元。此方法将以引用赋值而不是拷贝一个值。例如:<?php arr = array(1, 2, 3, 4);foreach ($arr as &$value) { value = $value * 2;} \/\/ $arr is now array(2, 4, 6, 8)?> var_dump($arr);#打印$arr...

php 对象在foreach中存入数组的key值后面的一个会被前面的覆盖是怎么回...
... . . . .. 你那个存的始终都是一个变量 ,,,foreach (a){ box->goods_name[] = $xx;} 你得这样存才行

php foreach数组问题
循环您可以用笨方法理解:\/\/ foreach 遍历开始,只执行了以下两个步骤:array["1"] = 200; \/\/ 这里会把字符串“1”变成整型 1,这里意思是设置第二个元素的值为200 array["2"] = 200; \/\/ 同理,这里意思是设置第三个元素的值为200 因此最后结果(那个第一个元素没有被改变,因此仍然存在...

PHP中foreach循环的用法?
foreach($array as $key=>$value){ echo $key.' is '.$value; } ps: $array 为要遍历的数组 $key 为遍历的数组下标 $key 为遍历的数组的值 希望采纳

PHP foreach($array as &$value){ 这里循环全部内容,但同时怎样获取数组...
你可以记一下数组的个数 num = count($array);foreach($array as $key=>&$value){ if($key==$num){ echo "最后一条";} }

php中foreach用法不解
他的格式是这样的foreach(数组名 as 下标=>值)下标也就是上面的$a[1],这里的1就是数组的下标!到这你应该明白了,为什么是$a[$key]这样输出 你记住不管怎么变,数组的输出方法永远是$a[1],不会是$a['语文']参考资料:www.bbskuer.com ...

PHP foreach 循环问题
分析 一段代码应该是比较通用的参数签名函数 循环部分作用 如果遍历的值有值或者是数字类型的话就把遍历的键和值拼接起来最后再和$signStr拼接起来,整个循环的结果就是把数组的键值都拼接反正一个字符串。代码解释 signStr .= $k.$v 等价于 signStr = $signStr.($k.$v)...

相似回答