foreach循环和&$ value的引用
为什么一个空的foreach循环可以改变结果。
我有以下代码:
$variable = [1,2,3,4];
foreach ($variable as $key => &$value)
$value ++;
var_dump($variable);
我得到的结果是:
array (size=4)
0 => int 2
1 => int 3
2 => int 4
3 => &int 5
现在,当我添加一个空的foreach循环像这样:
$variable = [1,2,3,4];
foreach ($variable as $key => &$value)
$value ++;
foreach ($variable as $key => $value);
var_dump($variable);
我得到这个:
array (size=4)
0 => int 2
1 => int 3
2 => int 4
3 => &int 4
有人可以解释为什么当我添加第二个空循环时为什么最后一个元素没有改变,为什么最后一个元素有一个&infront?
在第一个循环结束时, $value
指向与$variable[3]
相同的位置 ( 它们指向内存中的相同位置 ):
$variable = [1,2,3,4];
foreach ($variable as $key => &$value)
$value ++;
即使这个循环完成, $value
仍然是一个指向内存中与$variable[3]
相同的位置的引用,所以每次将值存储在$value
,这也会覆盖为$variable[3]
:
foreach ($variable as $key => $value);
var_dump($variable);
对这个foreach的每个评估, $value
和$variable[3]
都变成等于$ variable中可迭代项的值。
所以在第二次循环的第三次迭代中, $value
和$variable[3]
等于4,那么在第二次循环的第四次和最后一次迭代期间,没有任何变化,因为你传递的是$variable[3]
(它仍然是&$value
)到$value
(它仍然是&$value
)。
这非常令人困惑,但它甚至没有什么特别之处; 它的代码完全按照它应该执行的方式执行。
更多信息在这里:PHP:通过引用传递
这是一个名称冲突:第一个循环中引入的名称$ value存在于第二个循环中,并在第二个循环中使用。 所以对它的所有赋值实际上都是对原始数组的赋值。 你在这段代码中更容易观察到:
$variable = [1,2,3,4];
foreach ($variable as $key => &$value)
$value ++;
$value = 123; // <= here you alter the array!
var_dump($variable);
你会看到$variable[3]
为123
。
正如其他人所说,避免这种情况的一种方法是在循环之后unset ($value)
,这应该是手册推荐的一种良好做法。 另一种方法是在第二个循环中使用另一个变量:
$variable = [1,2,3,4];
foreach ($variable as $key => &$value)
$value ++;
foreach ($variable as $key => $val);
var_dump($variable);
这不会改变你的数组。
即使在foreach循环之后,数组的最后一个元素也会变成remor ..因此需要在循环外部使用unset
函数..这就是
$variable = [1,2,3,4];
foreach ($variable as $key => &$value) {
$value++;
}
unset($value);
var_dump($variable);
链接到手册可以在这里找到http://php.net/manual/en/control-structures.foreach.php
链接地址: http://www.djcxy.com/p/53039.html上一篇: foreach loop and reference of &$value
下一篇: How to check if variable is array?... or something array