Недавно я испытал эту странную проблему:
while(list($key, $value) = each($array))
не перечислял все значения массива, где замена его с...
foreach($array as $key => $value)
... работавший отлично.
И, мне любопытно теперь.. каково различие между теми двумя?
Просматривали ли вы ранее массив? each ()
запоминает свою позицию в массиве, поэтому, если вы не reset ()
, вы можете пропустить элементы.
reset($array);
while(list($key, $value) = each($array))
Как бы то ни было, этот метод обхода массива устарел и был заменен более идиоматическим foreach. Я бы не стал его использовать, если вы специально не хотите использовать его природу «по одному элементу за раз».
array each ( array & $ array)
Возвращает текущую пару ключей и значений из массива и перемещает курсор массива.
После выполнения
each ()
курсор массива останется на следующем элементе массива или за последним элементом, если он достигнет конца массива. Вы должны использоватьreset ()
, если хотите снова пройти по массиву, используякаждый
.
(Источник: Руководство по PHP )
Ну, одно отличие состоит в том, что each ()
будет работать только с массивами (хорошо, только правильно). foreach
будет работать с любым объектом, который реализует интерфейс traversable
(который, конечно, включает встроенный тип массива).
В foreach может быть микрооптимизация. По сути, foreach эквивалентен следующему:
$array->rewind();
while ($array->valid()) {
$key = $array->key();
$value = $array->current();
// Do your code here
$array->next();
}
В то время как каждый
в основном выполняет следующее:
$return = $array->valid() ? array($array->key(), $array->current()) : false;
$array->next();
return $return;
Таким образом, три строки одинаковы для обоих. Они оба очень похожи. Могут быть некоторые микрооптимизации в том, что каждому
не нужно беспокоиться об интерфейсе traversable
... Но это в лучшем случае будет незначительным. Но это также будет компенсировано выполнением логического преобразования и проверки в php-коде по сравнению с скомпилированным C foreach
... Не говоря уже о том, что в вашем коде while / each
вы вызываем две языковые конструкции и одну функцию, тогда как с foreach
это единственная языковая конструкция ...
Не говоря уже о том, что foreach
НАМНОГО читабельнее ИМХО ... Итак более легкий для чтения и более гибкий означает, что -to me- foreach
явный победитель. (это не значит, что каждый
не имеет своего применения, но лично мне это никогда не было нужно) ...
Если вы передал каждому
объект для итерации, руководство по PHP предупреждает, что это может привести к неожиданным результатам.
Что именно находится в $ array