php - 数组循环改变元素类型

标签 php arrays pass-by-reference

考虑这个 PHP 代码片段,它通过值引用在数组中循环:

$arr = [1 ,2 , 3];
var_dump($arr);
echo '<br>';

foreach ($arr as &$val) { // note ampersand sign
   // Anything
}

var_dump($arr);

现在首先 var_dump() 发出

array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }

但是第二个发射

array(3) { [0]=> int(1) [1]=> int(2) [2]=> &int(3) }

因此通过引用在数组中循环改变了最后一个值的类型——从整数到整数 reference ! 怎么可能呢?为什么 PHP 决定自己更改元素类型而开发人员并不想这样做?

最佳答案

要理解这种行为,您需要了解一些关于 PHP 的知识:

  • PHP 中的引用是对称的:您不是“创建对变量的引用”,而是“将变量添加到引用集”。
  • 通过引用的 foreach 与一系列通过引用的赋值相同,一个接一个。
  • 数组值本身被视为变量,并且可以具有所有相同的类型信息,包括作为引用集的一部分。

那么让我们“展开”你的循环:

// create a reference set containing $val and $arr[0]
$val =& $arr[0];
// remove $val from the first reference set, 
// and create a second reference set containing $val and $arr[1]
$val =& $arr[1];
// remove $val from the second reference set, 
// and create a third reference set containing $val and $arr[2]
$val =& $arr[2];

此时,$arr[0]$arr[1] 都在一个大小为 1 的引用集中,所以可以看作是“正常值” ”。但是,$arr[2] 仍然在包含 $val 的引用集中。

这意味着对 $arr[2] 的任何更改都将反射(reflect)在 $val 中,而对 $val 的任何更改将反射(reflect)在 $arr[2] 中。这就是为什么 var_dump& 注释该项目,以表明改变它也会改变其他地方的另一个变量。

这就是为什么总是在使用 foreach-by-reference 之后运行 unset($val); 是一个好习惯。

关于php - 数组循环改变元素类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57870508/

相关文章:

javascript - 如何在字符串中找到最长的单词并返回那些(不包括重复项)以及最大长度?

c# - 使用 Zip() 合并不同长度的数组而不丢失值

python - 通过对象引用的良好做法

php - 使用 mySql 按特定顺序获取数据

php - centOS 7 无法安装 php-mbstring 扩展

java - 在java中将int数组转换为bufferedImage

c# - 我应该使用 "ref"通过引用方法来传递集合(例如 List)吗?

java - 如何在java中显式地实现引用传递?

php - 正则表达式: does not contain

javascript - 使用动态字段通过 AJAX/jQuery 检索数据库信息的问题