PHP foreach 语句引用:重用迭代器时出现意外行为

问题描述 投票:0回答:1

此代码产生意外的输出:

$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
来自哪里?

php arrays foreach pass-by-reference
1个回答
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
指的是
$array
e
)的第四个元素。

之后,迭代数组并将第四个元素更改为当前元素。因此,在第二个循环的第一次迭代之后,它将是

abcda
,等等到
abcdd
。在最后一次迭代中,您将第 4 个元素更改为第 4 个元素,如
d
更改为
d

第一个循环之后你应该做

unset($item)
;只要您不再需要引用变量,就取消设置它是一种常见的做法,以防止此类混淆。

© www.soinside.com 2019 - 2024. All rights reserved.