PHP foreach声明引用:重用迭代器时的意外行为

时间:2011-06-09 04:06:17

标签: php arrays foreach pass-by-reference

此代码产生意外输出:

$array=str_split("abcde");
foreach($array as &$item)
    echo $item;

echo "\n";
foreach($array as $item)
    echo $item;

输出:

abcde
abcdd

如果对第二个循环使用&$item,一切正常。

我不明白这段代码会如何影响$array的内容。我可以认为隐式unset($header)会删除最后一行,但双dd来自哪里?

1 个答案:

答案 0 :(得分:12)

这可能有所帮助:

$array=str_split("abcde");
foreach($array as &$item)
    echo $item;

var_dump($array);

echo "\n";
foreach($array as $item) {
    var_dump($array);
    echo $item;
}

正如您在上次迭代后所看到的那样,$item指的是$arraye)的第4个元素。

之后,您遍历数组并将第4个元素更改为当前元素。因此,在第二次循环的第一次迭代之后,它将abcda等等abcdd。在最后一次迭代中,您将第4个元素更改为第4个元素,将d更改为d