W3docs

each()

PHP each() возвращала текущую пару ключ-значение и сдвигала указатель. Устарела в 7.2, удалена в 8.0. Поведение и замены на foreach.

Введение

Функция each() исторически использовалась для пошагового обхода array по одному элементу: она возвращала текущую пару ключ-значение и сдвигала внутренний указатель array вперёд. На её основе строился распространённый идиоматический цикл while для перебора массивов до того, как foreach стал стандартом.

Важно: each() была объявлена устаревшей в PHP 7.2 и полностью удалена в PHP 8.0. Вызов в PHP 8+ приводит к фатальной ошибке Error. Эта страница документирует её поведение для чтения и миграции старого кода — но никогда не используйте её в новом коде. Перейдите к разделу Современные альтернативы, чтобы узнать, что использовать вместо неё.

На этой странице описывается, что делала функция each(), её синтаксис и форма возвращаемого значения, поведение внутреннего указателя, делавшее её непростой в использовании, а также способы переписать каждый вариант использования с помощью foreach.

Синтаксис

Синтаксис функции each() выглядит следующим образом:

Синтаксис функции Each() в PHP

each(array $array): array|false

Функция each() принимает array в качестве параметра и возвращает array или false при неудаче.

Параметры

ПараметрТипОписание
$arrayarray (по ссылке)Array, из которого производится чтение и в котором сдвигается указатель. Работает как с индексированными, так и с ассоциативными массивами.

Array передаётся по ссылке, поскольку each() изменяет его — а именно, продвигает внутренний указатель array вперёд при каждом вызове.

Возвращаемое значение

При каждом вызове each() возвращает array из четырёх элементов с числовыми и строковыми ключами, указывающими на одни и те же данные:

ИндексСодержит
0текущий ключ
keyто же значение, что и 0
1текущее значение
valueто же значение, что и 1

Когда указатель выходит за пределы последнего элемента, each() возвращает false — именно это останавливает классический цикл while.

Использование

Классическая идиома объединяла each() с циклом while. На каждой итерации извлекалась одна пара и указатель сдвигался вперёд; когда пар не оставалось, each() возвращала false и цикл завершался.

Устаревший цикл each() (PHP 7.x и ранее)

<?php
// Legacy PHP 7.x example. This will throw a fatal Error in PHP 8.0+.
$array = ["one" => 1, "two" => 2, "three" => 3];

while ($element = each($array)) {
    echo $element['key'] . ' => ' . $element['value'] . "\n";
}
// Output:
// one => 1
// two => 2
// three => 3

Мы определяем ассоциативный array, а затем многократно вызываем each() внутри цикла while. Каждый вызов возвращает текущую пару (доступную как $element['key'] / $element['value']) и продвигает указатель до тех пор, пока each() не вернёт false.

Ловушка внутреннего указателя

Поскольку each() расходует внутренний указатель, по array можно полностью пройти только один раз. Чтобы выполнить цикл повторно, нужно было сначала вызвать reset() для перемотки указателя в начало. Забыть об этом — распространённый источник ошибок «цикл ничего не делает», и именно поэтому each() в итоге была удалена в пользу foreach, который использует собственный итератор и никогда не затрагивает array.

Современный эквивалент для PHP 8+

Вся конструкция while (each()) сворачивается в единственный, более чёткий foreach:

<?php
$array = ["one" => 1, "two" => 2, "three" => 3];

foreach ($array as $key => $value) {
    echo $key . ' => ' . $value . "\n";
}
// Output:
// one => 1
// two => 2
// three => 3

foreach короче, не затрагивает внутренний указатель (поэтому array остаётся пригодным для повторного использования) и единственный из двух, который работает в PHP 8+.

each() vs. похожие функции работы с массивами

each() часто упоминается вместе с другими инструментами итерации, однако каждый из них делает что-то своё:

ФункцияЧто делаетВозвращает пару ключ/значение?Затрагивает внутренний указатель?
foreachЯзыковая конструкция для перебора всех элементовДа (as $key => $value)Нет
array_walk()Применяет коллбэк к каждому элементу на местеНетНет
array_map()Строит новый array из результатов коллбэкаНетНет
current() / next() / key()Читает элемент по указателю / продвигает его / читает его ключЧастично (по отдельности)Да (next())

Если вам нужен ручной контроль над указателем, который раньше давала each(), используйте комбинацию current(), key(), next() и reset() — эти функции по-прежнему доступны в PHP 8+.

Устаревший статус и современные альтернативы

Функция each() объявлена устаревшей (PHP 7.2) и удалена (PHP 8.0). Для всего нового кода:

  • Нужно перебрать array? Используйте foreach.
  • Нужно преобразовать значения в новый array? Используйте array_map().
  • Нужно изменить элементы на месте? Используйте array_walk().
  • Нужен ручной пошаговый обход? Используйте current() + next() + reset().

Заключение

each() когда-то была основным способом обхода array и получения пар ключ-значение, однако зависимость от внутреннего указателя делала её ненадёжной, и в PHP 8.0 она была удалена полностью. Воспринимайте её как историю: узнавайте в устаревшем коде и заменяйте на foreach — более безопасный, быстрый и современный стандарт.

Практика

Практика
Какие утверждения о функции each() в PHP верны?
Какие утверждения о функции each() в PHP верны?
Was this page helpful?