PHP оператор foreach по ссылке: неожиданное поведение при повторном использовании итератора - PullRequest
9 голосов
/ 09 июня 2011

этот код выдает неожиданный вывод:

$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 Ответ

12 голосов
/ 09 июня 2011

Это может помочь:

$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 относится к 4-му элементу $array (e).

После этого вы перебираете массив и меняете четвертый элемент на текущий . Таким образом, после первой итерации второго цикла это будет abcda и т. Д. До abcdd. И в последней итерации вы меняете 4-й элемент на 4-й, как d на d

...