Предупреждение! Foreach создает копию массива , поэтому вы не можете изменить его , пока foreach выполняет итерации по нему .each()
по-прежнему имеет цель и может быть очень полезным, если вы выполняете живое редактирование массива, циклически перебирая его элементы и индексы.
// Foreach creates a copy
$array = [
"foo" => ['bar', 'baz'],
"bar" => ['foo'],
"baz" => ['bar'],
"batz" => ['end']
];
// while(list($i, $value) = each($array)) { // Try this next
foreach($array as $i => $value) {
print $i . "\n";
foreach($value as $index) {
unset($array[$index]);
}
}
print_r($array); // array('baz' => ['end'])
И foreach
, и while
завершат свои циклыи массив "$array
" будет изменен.Однако цикл foreach не изменился во время выполнения цикла, поэтому он повторялся по каждому элементу, даже если мы их удалили.
Обновление: этот ответ не является ошибкой.
IЯ подумал, что этот ответ довольно прост, но, похоже, большинство пользователей здесь не в состоянии оценить конкретные детали, которые я здесь упоминаю.
Разработчики, создавшие приложения с использованием libdom (например, удаление элементов) или другой интенсивной карты.Фильтрация / list / dict может подтвердить важность того, что я здесь сказал.
Если вы не поймете этот ответ, он однажды укусит вас.