真的不知道如何描述这一点,所以我会尝试让代码解释。
$numbers = [
10,
20,
30
];
foreach($numbers as &$number) {
$number = 1*$number;
}
var_dump($numbers);
foreach($numbers as $number) {
echo $number . "\n";
}
var_dump
给出以下输出:
array(2) {
[0]=>
int(10)
[1]=>
int(20)
[2]=>
&int(30)
}
但是循环同一数组会给出:
10
20
20
当我迭代数组时,为什么我得到的前两个元素是我定义的数字,但第三个元素似乎是第二个元素的副本。
为什么var_dump
具有“预期”结果,但包含第三个预期值的引用符号?
最佳答案
第一个循环退出后,$number
仍然存在,作为对数组中最后一项的引用。
foreach($numbers as &$number) { ... }
// $number still "points to" $numbers[2] here
然后,当第二个循环运行时,您可以像新变量一样重新使用 $number
,但它已被设置为引用:
foreach($numbers as $number) { ... }
实际上,PHP 将数组中的迭代值放入 $number
变量中,但 $number
变量不是一个空变量——它基本上是一个现有的指针到数组元素,所以第二个循环基本上是这样做的:
put $numbers[0] into $numbers[2]
put $numbers[1] into $numbers[2]
put $numbers[2] into $numbers[2]
您可以通过以下方式避免这种情况:
- 在第二个循环中使用除
$number
之外的变量。 - 在第一个循环后调用
unset($number)
。 - 不使用引用文献。
我推荐第三个选项,在第一个循环中执行此操作:
foreach ($numbers as $index => $number) {
$numbers[$index] = 1 * $number;
}
关于php - 了解 PHP 中奇怪的引用/循环行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65648377/