в то время как (список ($key, $value) = каждый ($array)) по сравнению с foreach ($array как $key => $value)?

Недавно я испытал эту странную проблему:

while(list($key, $value) = each($array))

не перечислял все значения массива, где замена его с...

foreach($array as $key => $value)

... работавший отлично.

И, мне любопытно теперь.. каково различие между теми двумя?

36
задан John Kugelman supports Monica 22 July 2010 в 00:36
поделиться

3 ответа

Просматривали ли вы ранее массив? each () запоминает свою позицию в массиве, поэтому, если вы не reset () , вы можете пропустить элементы.

reset($array);
while(list($key, $value) = each($array))

Как бы то ни было, этот метод обхода массива устарел и был заменен более идиоматическим foreach. Я бы не стал его использовать, если вы специально не хотите использовать его природу «по одному элементу за раз».

array each ( array & $ array)

Возвращает текущую пару ключей и значений из массива и перемещает курсор массива.

После выполнения each () курсор массива останется на следующем элементе массива или за последним элементом, если он достигнет конца массива. Вы должны использовать reset () , если хотите снова пройти по массиву, используя каждый .

(Источник: Руководство по PHP )

55
ответ дан 27 November 2019 в 05:38
поделиться

Ну, одно отличие состоит в том, что 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 явный победитель. (это не значит, что каждый не имеет своего применения, но лично мне это никогда не было нужно) ...

13
ответ дан 27 November 2019 в 05:38
поделиться

Если вы передал каждому объект для итерации, руководство по PHP предупреждает, что это может привести к неожиданным результатам.

Что именно находится в $ array

1
ответ дан 27 November 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: