each()
PHP each() restituiva la coppia chiave-valore corrente e avanzava il puntatore dell'array. Deprecata in 7.2, rimossa in 8.0.
Introduzione
La funzione each() veniva utilizzata storicamente per scorrere un array un elemento alla volta, restituendo la coppia chiave-valore corrente e avanzando il puntatore interno dell'array. Alimentava un idioma con ciclo while un tempo comune per iterare gli array, prima che foreach diventasse lo standard.
Importante:
each()è stata deprecata in PHP 7.2 e completamente rimossa in PHP 8.0. Chiamarla in PHP 8+ genera unErrorfatale. Questa pagina documenta il suo comportamento legacy per consentirti di leggere e migrare il codice vecchio — ma non dovresti mai scrivere nuovo codice con essa. Vai alle Alternative moderne per sapere cosa usare al suo posto.
Questa pagina illustra cosa faceva each(), la sua sintassi e il formato del valore restituito, il comportamento del puntatore interno che la rendeva insidiosa, e come riscrivere ogni utilizzo con foreach.
Sintassi
La sintassi della funzione each() è la seguente:
Sintassi della funzione Each() in PHP
each(array $array): array|falseLa funzione each() prende un array come parametro e restituisce un array oppure false in caso di fallimento.
Parametri
| Parametro | Tipo | Descrizione |
|---|---|---|
$array | array (per riferimento) | L'array da cui leggere e avanzare. Funziona sia con array indicizzati che associativi. |
L'array viene passato per riferimento perché each() lo modifica — nello specifico, sposta il puntatore interno dell'array in avanti ad ogni chiamata.
Valore restituito
Ad ogni chiamata, each() restituisce un array di quattro elementi, con chiavi numeriche e stringa che puntano agli stessi dati:
| Indice | Contiene |
|---|---|
0 | la chiave corrente |
key | lo stesso valore di 0 |
1 | il valore corrente |
value | lo stesso valore di 1 |
Quando il puntatore ha superato l'ultimo elemento, each() restituisce false — ed è questo che interrompe il classico ciclo while.
Utilizzo
L'idioma classico abbinava each() a un ciclo while. Ogni iterazione otteneva una coppia e avanzava il puntatore; quando non restavano più coppie, each() restituiva false e il ciclo terminava.
Ciclo each() legacy (PHP 7.x e precedenti)
<?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 => 3Definiamo un array associativo, poi chiamiamo each() ripetutamente all'interno di un while. Ogni chiamata restituisce la coppia corrente (accessibile come $element['key'] / $element['value']) e avanza il puntatore, finché each() non restituisce infine false.
Il problema del puntatore interno
Poiché each() consuma il puntatore interno, un array è attraversabile completamente una sola volta. Per eseguire un secondo ciclo era necessario chiamare prima reset() per riportare il puntatore all'inizio. Dimenticarsene era una frequente fonte di bug del tipo "il mio ciclo non fa nulla" — ed è uno dei motivi per cui each() è stata infine rimossa a favore di foreach, che usa il proprio iteratore e non disturba mai l'array.
Equivalente moderno in PHP 8+
L'intero pattern while (each()) si riduce a un singolo, più chiaro 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 è più conciso, non tocca il puntatore interno (quindi l'array rimane riutilizzabile), ed è l'unico dei due che funziona in PHP 8+.
each() vs. funzioni simili per gli array
each() viene spesso raggruppata con altri strumenti di iterazione, ma ognuno fa qualcosa di distinto:
| Funzione | Cosa fa | Restituisce una coppia chiave/valore? | Tocca il puntatore interno? |
|---|---|---|---|
foreach | Costrutto del linguaggio per ciclare ogni elemento | Sì (as $key => $value) | No |
array_walk() | Applica una callback a ogni elemento, in-place | No | No |
array_map() | Costruisce un nuovo array dai risultati di una callback | No | No |
current() / next() / key() | Legge l'elemento al puntatore / lo avanza / legge la sua chiave | Parzialmente (separatamente) | Sì (next()) |
Se hai bisogno del controllo manuale del puntatore che each() offriva un tempo, combina current(), key(), next() e reset() — quelle funzioni sono ancora disponibili in PHP 8+.
Stato legacy e alternative moderne
La funzione each() è deprecata (PHP 7.2) e rimossa (PHP 8.0). Per tutto il nuovo codice:
- Vuoi iterare un array? Usa
foreach. - Vuoi trasformare i valori in un nuovo array? Usa
array_map(). - Vuoi modificare gli elementi in-place? Usa
array_walk(). - Hai bisogno di scorrere manualmente? Usa
current()+next()+reset().
Conclusione
each() era un tempo il metodo prediletto per percorrere un array e ottenere coppie chiave-valore, ma la sua dipendenza dal puntatore interno la rendeva soggetta a errori, e PHP 8.0 l'ha rimossa completamente. Trattala come storia da consultare: riconoscila nel codice legacy, poi sostituiscila con foreach — che è più sicuro, più veloce e lo standard moderno.