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 при неудаче.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
$array | array (по ссылке) | 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 => 3foreach короче, не затрагивает внутренний указатель (поэтому 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 — более безопасный, быстрый и современный стандарт.