php - PHP 的 foreach 幕后发生了什么?

标签 php arrays foreach php-7.1

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/

相关文章:

c++ - 指向二维数组的指针 C、C++

php - mysql php显示结果但不插入数据库

php - Google+ 圈子数据库逻辑

php - SQL Server 的 ODBC 驱动程序 18]SSL 提供程序 : [error:1416F086]

image - SwiftUI、CloudKit 和图像

php - 使用 PHP glob 获取文件夹 - 无限深度

rust - 借用检查器阻止迭代器在递归函数内调用 for_each

php - 如何获取 AWS Route53 托管区域 ID?

javascript - 在 React JS 中导入数组函数后无法检索我的电影数据

c - 在C中复制2D数组的内容