在第一个foreach循环之后,$item
仍然是对$arr[2]
也在使用的某个值的引用.因此,第二个循环中的每个foreach调用(不是通过引用调用)都会用新值替换该值,从而替换$arr[2]
.
So loop 1, the value and $arr[2]
become $arr[0]
, which is 'foo'.
Loop 2, the value and $arr[2]
become $arr[1]
, which is 'bar'.
Loop 3, the value and $arr[2]
become $arr[2]
, which is 'bar' (because of loop 2).
值"baz"实际上在第二个foreach循环的第一次调用中丢失.
调试输出
对于循环的每次迭代,我们将 echo 值$item
,并递归打印数组$arr
.
当运行第一个循环时,我们会看到以下输出:
foo
Array ( [0] => foo [1] => bar [2] => baz )
bar
Array ( [0] => foo [1] => bar [2] => baz )
baz
Array ( [0] => foo [1] => bar [2] => baz )
在循环结束时,$item
仍然指向与$arr[2]
相同的位置.
当运行第二个循环时,我们会看到以下输出:
foo
Array ( [0] => foo [1] => bar [2] => foo )
bar
Array ( [0] => foo [1] => bar [2] => bar )
bar
Array ( [0] => foo [1] => bar [2] => bar )
您将注意到,每次数组如何将一个新值放入$item
,它还会用相同的值更新$arr[3]
,因为它们仍然指向相同的位置.当循环到达数组的第三个值时,它将包含值bar
,因为它刚刚由该循环的前一次迭代设置.
是虫子吗?
不.这是引用项的行为,而不是错误.这与运行类似:
for ($i = 0; $i < count($arr); $i++) { $item = $arr[$i]; }
foreach循环在本质上并不特殊,它可以忽略引用的项.只需每次将该变量设置为新值,就像在循环之外一样.