PHP 7.1 中的实验(docker image nanoninja/php-fpm:7.1)
在下一段代码中,一切都清楚了:
$arr1 = [1, 2, 3];
foreach ($arr1 as &$value) {
$value *= 2;
}
我们有数组 $arr1
并将所有值乘以 2。结果:
array(3) {
[0]=>
int(2)
[1]=>
int(4)
[2]=>
&int(6)
}
但是这个语句中发生了什么:
$arr1 = [1, 2, 3];
foreach ($arr2 = $arr1 as &$value) {
$value *= 2;
}
数组 $arr1
和 $arr2
的结果将不可更改:
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
为什么会这样?我知道在 PHP > 7 中 foreach
使用数组的副本,但在这种情况下它使用哪个数组的副本 $arr1
或 $arr2
.为什么 &
不起作用?
最佳答案
foreach
仅适用于正常按值模式的数组副本,不适用于按引用模式。因此 PHP 7 中的更改与此代码无关。
但是在你的第二个代码块中,你没有使用变量作为数组来迭代,所以没有什么可以引用的。相反,您有一个表达式,表达式的值是数组的副本。它本质上等同于:
$temp = $array1 = $array2;
foreach ($temp as &$value) {
$value *= 2;
}
这将更新 $temp
,但不会更新 $array1
或 $array2
。
关于php - PHP 的 foreach 幕后发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54125863/