next()
Scopri come next() di PHP avanza il puntatore interno di un array, restituisce l'elemento successivo o false alla fine, e si abbina a reset(), current() e prev().
Introduzione
Ogni array PHP mantiene un puntatore interno che contrassegna un elemento come "corrente". Una piccola famiglia di funzioni sposta quel puntatore senza dover scrivere un ciclo: reset(), current(), prev(), end() e next(). Questo articolo si concentra su next() — cosa restituisce, come modifica il puntatore e i casi limite che possono trarre in inganno.
Cosa fa la funzione next()
next() avanza il puntatore interno dell'array di una posizione e restituisce il valore dell'elemento su cui si trova. La firma è:
next(array &$array): mixedDa questa firma discendono alcune considerazioni:
- L'array viene passato per riferimento (
&$array).next()non restituisce un nuovo array — muta il puntatore dell'array passato. - Restituisce il valore dell'elemento successivo, non quello corrente. Se vuoi l'elemento sotto il puntatore senza spostarlo, usa
current(). - Al termine dell'array restituisce
falsee lascia il puntatore fermo oltre l'ultimo elemento. Chiamare di nuovonext()continua a restituirefalse.
Quando uno script inizia, il puntatore si trova sul primo elemento, quindi la primissima chiamata a next() restituisce già il secondo elemento, non il primo. Questa è la fonte più comune di confusione "off-by-one" con next().
Esempio base
<?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 -> falseQuesto produce:
apple
banana
cherry
bool(false)current() legge il primo elemento senza spostare il puntatore, poi ogni next() avanza di un elemento. L'ultima chiamata supera la fine dell'array e restituisce false.
Scorrere un array con next()
Un pattern comune è partire con reset() (per essere sicuri che il puntatore sia all'inizio) e ciclare con next() finché non restituisce false:
<?php
$colors = ['red', 'green', 'blue'];
reset($colors);
echo current($colors) . "\n"; // first element
while (($color = next($colors)) !== false) {
echo $color . "\n";
}Output:
red
green
blueNota il !== false (confronto rigoroso). Questo è importante — vedi la sezione successiva.
Il problema dei "valori falsy"
next() restituisce false alla fine dell'array, ma restituisce false anche se il valore effettivo di un elemento è false, 0, "" o null. Un controllo non rigoroso come while (next($array)) si interromperà prematuramente non appena incontra uno di questi valori:
<?php
$data = ['a', 0, 'b'];
reset($data);
// WRONG: stops at the 0, never reaches 'b'
while ($value = next($data)) {
echo $value . "\n";
}
echo "---\n";Questo stampa solo:
---Il ciclo termina immediatamente perché next() restituisce 0 (il secondo elemento), che è falsy. Per gli array che possono contenere valori falsy, è preferibile usare foreach, che bypassa completamente il puntatore interno, oppure usare key() per rilevare la vera fine:
<?php
$data = ['a', 0, 'b'];
reset($data);
do {
echo current($data) . "\n";
} while (next($data) !== null && key($data) !== null);In pratica, un semplice foreach è lo strumento giusto per iterare su ogni elemento; ricorri a next() solo quando hai davvero bisogno di un controllo manuale e passo dopo passo del puntatore.
next() e le funzioni correlate per il puntatore
| Funzione | Sposta il puntatore? | Restituisce |
|---|---|---|
current() | No | Elemento sotto il puntatore |
next() | In avanti di uno | Nuovo elemento corrente (o false alla fine) |
prev() | Indietro di uno | Nuovo elemento corrente (o false prima dell'inizio) |
reset() | Al primo | Primo elemento |
end() | All'ultimo | Ultimo elemento |
key() | No | Chiave dell'elemento corrente (o null oltre la fine) |
Combinare next() e prev() consente di guardare avanti e tornare indietro durante una singola passata su un array.
Conclusione
La funzione next() avanza il puntatore interno di un array di un passo e restituisce il valore su cui si trova, oppure false una volta raggiunta la fine. Poiché si basa sul puntatore interno e segnala la fine con false, si abbina naturalmente a reset(), current() e prev() — ma attenzione agli array contenenti valori falsy, dove una condizione di ciclo non rigorosa si interromperà troppo presto. Per un'iterazione semplice, preferisci foreach; usa next() quando hai bisogno di un controllo esplicito sulla posizione del puntatore.