next()
Узнайте, как next() перемещает внутренний указатель массива, возвращает следующий элемент или false в конце, и как она сочетается с reset(), current() и prev().
Введение
Каждый массив PHP хранит внутренний указатель, который отмечает один элемент как «текущий». Небольшой набор функций перемещает этот указатель без написания цикла вручную: reset(), current(), prev(), end() и next(). Эта статья сосредоточена на next() — что она возвращает, как изменяет указатель и какие крайние случаи вызывают затруднения.
Что делает функция next()
next() продвигает внутренний указатель массива на одну позицию вперёд и возвращает значение элемента, на котором он оказывается. Сигнатура выглядит так:
next(array &$array): mixedИз этой сигнатуры следует несколько важных выводов:
- Массив передаётся по ссылке (
&$array).next()не возвращает новый массив — она изменяет указатель переданного массива. - Возвращается значение следующего элемента, а не текущего. Если нужно получить элемент под указателем без его перемещения, используйте
current(). - В конце массива возвращается
false, а указатель остаётся за последним элементом. Повторный вызовnext()продолжает возвращатьfalse.
При запуске скрипта указатель находится на первом элементе, поэтому самый первый вызов next() уже возвращает второй элемент, а не первый. Это наиболее распространённый источник ошибок «на один шаг» при работе с next().
Базовый пример
<?php
$fruits = ['apple', 'banana', 'cherry'];
echo current($fruits) . "\n"; // pointer starts on the first element
echo next($fruits) . "\n"; // move forward, return the second
echo next($fruits) . "\n"; // move forward, return the third
var_dump(next($fruits)); // past the end -> falseВывод:
apple
banana
cherry
bool(false)current() читает первый элемент без перемещения указателя, затем каждый вызов next() делает шаг вперёд на один элемент. Последний вызов выходит за пределы массива и возвращает false.
Обход массива с помощью next()
Распространённый шаблон — начать с reset() (чтобы убедиться, что указатель находится в начале) и выполнять цикл с next() до тех пор, пока она не вернёт false:
<?php
$colors = ['red', 'green', 'blue'];
reset($colors);
echo current($colors) . "\n"; // first element
while (($color = next($colors)) !== false) {
echo $color . "\n";
}Вывод:
red
green
blueОбратите внимание на !== false (строгое сравнение). Это важно — см. следующий раздел.
Проблема «ложных значений»
next() возвращает false в конце массива, но также возвращает false, если фактическое значение элемента равно false, 0, "" или null. Нестрогая проверка вида while (next($array)) остановится раньше времени, как только встретит одно из таких значений:
<?php
$data = ['a', 0, 'b'];
reset($data);
// WRONG: stops at the 0, never reaches 'b'
while ($value = next($data)) {
echo $value . "\n";
}
echo "---\n";Выводится только:
---Цикл завершается немедленно, потому что next() возвращает 0 (второй элемент), что является ложным значением. Для массивов, которые могут содержать ложные значения, предпочтительнее использовать foreach, который полностью обходит внутренний указатель, или использовать key() для определения реального конца:
<?php
$data = ['a', 0, 'b'];
reset($data);
do {
echo current($data) . "\n";
} while (next($data) !== null && key($data) !== null);На практике обычный foreach — правильный инструмент для перебора каждого элемента; обращайтесь к next() только тогда, когда вам действительно нужен ручной пошаговый контроль над указателем.
next() и связанные функции управления указателем
| Функция | Перемещает указатель? | Возвращает |
|---|---|---|
current() | Нет | Элемент под указателем |
next() | Вперёд на один | Новый текущий элемент (или false в конце) |
prev() | Назад на один | Новый текущий элемент (или false перед началом) |
reset() | К первому | Первый элемент |
end() | К последнему | Последний элемент |
key() | Нет | Ключ текущего элемента (или null за концом) |
Комбинирование next() и prev() позволяет заглядывать вперёд и возвращаться назад в рамках одного прохода по массиву.
Заключение
Функция next() продвигает внутренний указатель массива на один шаг вперёд и возвращает значение, на котором он оказывается, или false, когда выходит за его пределы. Поскольку она опирается на внутренний указатель и сигнализирует о конце через false, она естественно сочетается с reset(), current() и prev() — но следует остерегаться массивов с ложными значениями, где нестрогое условие цикла остановится раньше срока. Для простого перебора предпочитайте foreach; используйте next(), когда нужен явный контроль над положением указателя.