W3docs

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 un Error fatale. 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|false

La funzione each() prende un array come parametro e restituisce un array oppure false in caso di fallimento.

Parametri

ParametroTipoDescrizione
$arrayarray (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:

IndiceContiene
0la chiave corrente
keylo stesso valore di 0
1il valore corrente
valuelo 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 => 3

Definiamo 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 => 3

foreach è 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:

FunzioneCosa faRestituisce una coppia chiave/valore?Tocca il puntatore interno?
foreachCostrutto del linguaggio per ciclare ogni elementoSì (as $key => $value)No
array_walk()Applica una callback a ogni elemento, in-placeNoNo
array_map()Costruisce un nuovo array dai risultati di una callbackNoNo
current() / next() / key()Legge l'elemento al puntatore / lo avanza / legge la sua chiaveParzialmente (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:

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.

Pratica

Pratica
Quali affermazioni sulla funzione each() in PHP sono corrette?
Quali affermazioni sulla funzione each() in PHP sono corrette?
Was this page helpful?