简介:
你是否遇到过一个奇怪的现象,最后一个使用带有引用传递的 foreach 进行迭代后,PHP 数组的元素出现重复?这种令人费解的行为通常会引发有关潜在错误或奇怪的系统行为的问题。
理解行为:
理解这一点的关键是按引用传递的本质在 PHP 的 foreach 循环中。当参数中使用“&”时,直接修改对数组元素的引用,而不是复制。这意味着对循环中传递的变量所做的任何更改都会直接影响原始数组。
问题中的错误:
在提供的示例中:
$arr = ["foo", "bar", "baz"]; foreach ($arr as &$item) {} foreach ($arr as $item) {}
第一个 foreach 循环建立对数组元素的引用。由于 $item 现在是一个引用,因此在循环内修改它也会更改相应的数组元素。
但是,第二个 foreach 循环不会建立引用。这意味着当循环为 $item 分配新值时,只会影响本地副本,不会更新原始数组。
复制效果:
现在,让我们考虑 $item 是对最后一个数组元素(即“baz”)的引用的情况。由于第一个循环建立了该参考,因此第二个循环也使用相同的参考。因此,在第二个循环中分配给 $item 的任何值都会直接传递给 $arr[2]。
因此,当第二个循环将 'bar' 分配给 $item 时,它会无意中替换最后一个元素数组中带有“bar”,导致明显的重复。
预期输出与实际输出:
循环之前:["foo", "bar" , "baz"]
第一个循环(引用)之后:["foo", "bar", "foo"](因为 $item 仍然引用 $arr[2])
第二个循环之后(非引用):["foo", "bar", "bar"]
这是一个错误吗?
不,此行为不是错误。这只是在 PHP 的 foreach 循环中使用引用的预期结果。 $item 的值是对原始数组元素的引用,每当修改时都会影响底层数组。
以上是为什么在使用 foreach 和引用传递后,PHP 数组的最后一个元素出现重复?的详细内容。更多信息请关注PHP中文网其他相关文章!