next()
Узнайте, как PHP next() перемещает внутренний указатель массива, что она возвращает, ловушку с ложными значениями и как она работает с reset(), current() и prev().
Функция PHP next()
Каждый массив PHP имеет внутренний указатель, который отмечает один элемент как «текущий». Функция next() перемещает этот указатель вперёд на одну позицию и возвращает значение, на котором он останавливается. Она входит в небольшое семейство функций для работы с указателем — reset(), current(), prev() и end() — которые позволяют обходить массив шаг за шагом без написания собственного счётчика индексов. В этом руководстве подробно объясняется, что возвращает next(), как она изменяет указатель и какие граничные случаи могут застать вас врасплох.
Синтаксис и возвращаемое значение
next(array &$array): mixedИз этой сигнатуры вытекают три важных момента:
- Массив передаётся по ссылке (
&$array).next()не возвращает новый массив — она изменяет внутренний указатель переданного массива. - Она возвращает значение следующего элемента, а не текущего. Чтобы прочитать элемент под указателем без его перемещения, используйте
current(). - В конце массива она возвращает
falseи оставляет указатель за последним элементом. Все последующие вызовы также возвращаютfalse.
Когда скрипт впервые обращается к массиву, указатель стоит на первом элементе. Поэтому самый первый вызов next() уже возвращает второй элемент — распространённая причина ошибок «плюс-минус один».
Базовый пример next()
Фрагмент ниже читает первый элемент с помощью current(), затем дважды перемещается вперёд. Последний вызов выходит за конец массива и возвращает false:
Вывод:
apple
banana
cherry
bool(false)Обход массива с помощью next()
Распространённый паттерн — сначала вызвать reset() (чтобы убедиться, что указатель стоит в начале), вывести первый элемент, затем циклически вызывать next() до тех пор, пока она не вернёт false:
Это выведет:
red
green
blueОбратите внимание на строгое сравнение !== false — следующий раздел объясняет, почему нестрогая проверка опасна.
Ловушка с ложными значениями
next() возвращает false в конце массива, но также возвращает false, когда реальное значение элемента равно false, 0, "" или null. Нестрогое условие вида while (next($array)) поэтому остановится, как только встретит одно из таких значений:
Поскольку next() возвращает 0 для второго элемента, тело цикла никогда не выполняется — вывод будет лишь:
doneДля массивов, которые могут содержать ложные значения, предпочтите foreach (он полностью игнорирует внутренний указатель) или проверяйте key(), который возвращает null только при достижении настоящего конца массива.
Как next() связана с другими функциями указателя
next() редко используется в одиночку. Она работает в паре с reset(), current(), prev(), end() и key(), предоставляя полный ручной контроль над курсором массива:
| Функция | Перемещает указатель? | Возвращает |
|---|---|---|
current() | Нет | Элемент под указателем |
next() | Вперёд на один | Новый текущий элемент (или false в конце) |
prev() | Назад на один | Новый текущий элемент (или false перед началом) |
reset() | К первому | Первый элемент |
end() | К последнему | Последний элемент |
key() | Нет | Ключ текущего элемента (или null за концом) |
Пример ниже использует end() и prev() вместе с next(), чтобы показать, как указатель может перемещаться в обоих направлениях за один проход:
Вывод:
30
20
30
10Когда использовать next()
Для обычного перебора всех элементов цикл foreach понятнее и безопаснее — он никогда не спотыкается о ложные значения. Прибегайте к next() только тогда, когда вам действительно нужен явный пошаговый контроль над положением указателя, например при заглядывании вперёд в середине цикла.
Заключение
Функция next() перемещает внутренний указатель массива на один шаг вперёд и возвращает значение, на котором он останавливается, возвращая false после прохождения последнего элемента. Поскольку она зависит от внутреннего указателя и сигнализирует о конце значением false, она работает в связке с reset(), current() и prev() — просто помните о ловушке с ложными значениями, когда нестрогое условие цикла останавливается слишком рано. Для обычной итерации предпочтите foreach; выбирайте next(), когда вам нужен точный контроль над курсором массива.