next()
Aprende cómo next() de PHP avanza el puntero interno de un array, devuelve el siguiente elemento o false al final, y se combina con reset(), current() y prev().
Introducción
Cada array en PHP mantiene un puntero interno que marca un elemento como "actual". Una pequeña familia de funciones mueve ese puntero sin necesidad de escribir un bucle: reset(), current(), prev(), end() y next(). Este artículo se centra en next() — qué devuelve, cómo cambia el puntero y los casos límite que suelen confundir.
Qué hace la función next()
next() avanza el puntero interno del array una posición y devuelve el valor del elemento en el que se detiene. La firma es:
next(array &$array): mixedAlgunas consecuencias de esa firma:
- El array se pasa por referencia (
&$array).next()no devuelve un nuevo array — muta el puntero del array que le pasas. - Devuelve el valor del elemento siguiente, no el actual. Si deseas el elemento bajo el puntero sin moverlo, usa
current(). - Al final del array devuelve
falsey deja el puntero estacionado más allá del último elemento. Llamar anext()de nuevo sigue devolviendofalse.
Cuando un script comienza, el puntero apunta al primer elemento, por lo que el primer next() ya devuelve el segundo elemento, no el primero. Esta es la fuente más común de confusión de "desfase de uno" con next().
Ejemplo básico
<?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 -> falseEsto produce:
apple
banana
cherry
bool(false)current() lee el primer elemento sin mover el puntero, luego cada next() avanza un elemento. La última llamada sale del final del array y devuelve false.
Recorrer un array con next()
Un patrón común es comenzar con reset() (para asegurarse de que el puntero está al inicio) y hacer un bucle con next() hasta que devuelva false:
<?php
$colors = ['red', 'green', 'blue'];
reset($colors);
echo current($colors) . "\n"; // first element
while (($color = next($colors)) !== false) {
echo $color . "\n";
}Salida:
red
green
blueObserva el !== false (comparación estricta). Esto es importante — consulta la siguiente sección.
El problema de los "valores falsy"
next() devuelve false al final del array, pero también devuelve false si el valor real de un elemento es false, 0, "" o null. Una comprobación laxa como while (next($array)) se detendrá prematuramente en el momento en que encuentre uno de esos valores:
<?php
$data = ['a', 0, 'b'];
reset($data);
// WRONG: stops at the 0, never reaches 'b'
while ($value = next($data)) {
echo $value . "\n";
}
echo "---\n";Esto imprime únicamente:
---El bucle termina de inmediato porque next() devuelve 0 (el segundo elemento), que es falsy. Para arrays que pueden contener valores falsy, es preferible usar foreach, que evita por completo el puntero interno, o usar key() para detectar el final real:
<?php
$data = ['a', 0, 'b'];
reset($data);
do {
echo current($data) . "\n";
} while (next($data) !== null && key($data) !== null);En la práctica, un simple foreach es la herramienta adecuada para iterar sobre cada elemento; recurre a next() solo cuando realmente necesites un control manual y paso a paso del puntero.
next() y las funciones relacionadas con el puntero
| Función | ¿Mueve el puntero? | Devuelve |
|---|---|---|
current() | No | Elemento bajo el puntero |
next() | Avanza uno | Nuevo elemento actual (o false al final) |
prev() | Retrocede uno | Nuevo elemento actual (o false antes del inicio) |
reset() | Al primero | Primer elemento |
end() | Al último | Último elemento |
key() | No | Clave del elemento actual (o null más allá del final) |
Combinar next() y prev() permite mirar hacia adelante y retroceder durante un único recorrido por un array.
Conclusión
La función next() avanza el puntero interno de un array un paso hacia adelante y devuelve el valor en el que se detiene, o false cuando sale del final. Como depende del puntero interno y señala el final con false, se combina naturalmente con reset(), current() y prev() — pero cuidado con los arrays que contienen valores falsy, donde una condición de bucle laxa se detendrá demasiado pronto. Para una iteración sencilla, prefiere foreach; usa next() cuando necesites un control explícito sobre dónde se encuentra el puntero.