La funzione array_walk() di PHP: come usarla per manipolare gli array in modo efficiente
Scopri come array_walk() di PHP applica una callback a ogni elemento di un array in-place, con sintassi, esempi e confronto con array_map().
array_walk() è una funzione built-in di PHP che applica una callback a ogni elemento di un array, in-place. A differenza di array_map(), che costruisce e restituisce un nuovo array, array_walk() scorre l'array esistente e ti permette di modificare ogni elemento direttamente tramite un riferimento. Questa pagina illustra la sua sintassi, quando usarla al posto di un semplice ciclo foreach o di array_map(), le insidie più comuni nella modifica dei valori, e come scorrere array annidati con array_walk_recursive().
Sintassi
array_walk(array &$array, callable $callback, mixed $arg = null): true| Parametro | Obbligatorio | Descrizione |
|---|---|---|
$array | Sì | L'array su cui iterare. Viene passato per riferimento, quindi la callback può modificarne gli elementi. |
$callback | Sì | Un callable eseguito una volta per ogni elemento. La sua firma è callback($value, $key, $arg). Per modificare un elemento, dichiara il primo parametro per riferimento: function (&$value) { ... }. |
$arg | No | Un argomento extra opzionale passato come terzo parametro a ogni chiamata della callback. |
array_walk() restituisce sempre true (restituisce false solo in caso di errore di tipo). Non restituisce l'array modificato — l'array passato viene modificato direttamente.
Perché passare
$valueper riferimento? Senza il simbolo&, la callback riceve una copia di ogni elemento, quindi qualsiasi modifica viene scartata. Aggiungendo&(come infunction (&$value)), le modifiche vengono scritte nell'array originale. Consulta funzioni PHP e callable per ulteriori informazioni sulle callback.
Esempi di utilizzo di array_walk()
Esempio 1: Modificare gli array
Uno degli utilizzi principali di array_walk() è modificare gli array. Grazie alla capacità di applicare una funzione definita dall'utente a ogni elemento di un array, è un modo semplice per trasformare un array secondo le proprie esigenze. Ecco un esempio di come usare array_walk() per cambiare il formato testuale di tutti gli elementi di un array.
Esempio PHP 1: Modificare gli array
Output:
Array
(
[0] => APPLE
[1] => BANANA
[2] => CHERRY
)In questo esempio, definiamo prima un array con tre elementi. Definiamo poi una funzione chiamata change_case() che usa la funzione built-in strtoupper() di PHP per convertire ogni elemento in maiuscolo. Utilizziamo quindi array_walk() per applicare la funzione change_case() a ogni elemento dell'array. Infine, usiamo la funzione print_r() per visualizzare l'array modificato.
Esempio 2: Eseguire calcoli
Un altro utilizzo efficace di array_walk() è eseguire calcoli sugli array. Grazie alla possibilità di applicare una funzione definita dall'utente a ogni elemento, puoi usare array_walk() per eseguire un'ampia gamma di calcoli sui tuoi array. Ecco un esempio di come usare array_walk() per calcolare la somma di tutti gli elementi di un array.
Esempio 2: Eseguire calcoli
Output:
The total sum is: 15In questo esempio, definiamo prima un array con cinque elementi. Definiamo poi una funzione anonima che aggiunge ogni elemento a un totale progressivo. Usiamo la funzione array_walk() per applicare la funzione a ogni elemento dell'array. Infine, visualizziamo la somma totale tramite l'istruzione echo.
Esempio 3: Scorrere array multidimensionali
La semplice array_walk() visita solo gli elementi di primo livello, quindi su un array annidato la callback riceverebbe gli array interni anziché i valori foglia. Per dati annidati, usa la funzione complementare array_walk_recursive(), che scende nei sotto-array ed esegue la callback su ogni valore foglia. Qui convertiamo in maiuscolo ogni stringa in un array a due livelli.
Esempio PHP 3: Lavorare con array multidimensionali
Output:
Array
(
[0] => Array
(
[0] => APPLE
[1] => BANANA
[2] => CHERRY
)
[1] => Array
(
[0] => ORANGE
[1] => GRAPE
[2] => PINEAPPLE
)
)array_walk_recursive() percorre la struttura in profondità (depth-first) e chiama change_case() su ogni stringa foglia, lasciando intatta la struttura annidata dell'array mentre converte ogni valore in maiuscolo.
Insidie comuni
- Dimenticare il simbolo
&. Se il primo parametro della callback non è per riferimento (function (&$value)), le modifiche vengono scartate silenziosamente. Questo è l'errore più comune conarray_walk(). - Restituire un valore non ha effetto.
array_walk()ignora qualsiasi valore restituito dalla callback. Scrive le modifiche solo tramite il parametro passato per riferimento. Se invece vuoi creare una copia trasformata, usaarray_map(). - L'ordine dei parametri della callback è
($value, $key)— prima il valore, poi la chiave. È l'opposto di quanto molti sviluppatori si aspettano. - Non è possibile aggiungere o rimuovere chiavi. Impostare
$array = nulldentro la callback, o modificare la struttura dell'array durante lo scorrimento, porta a comportamenti indefiniti. Usaarray_walk()solo per trasformare i valori in-place.
array_walk() vs. array_map() vs. foreach
| Strumento | Modifica in-place? | Restituisce | Ideale per |
|---|---|---|---|
array_walk() | Sì (tramite riferimento) | true | Mutare un array esistente o eseguire un effetto collaterale per ogni elemento |
array_map() | No | Un nuovo array | Produrre una copia trasformata senza toccare l'originale |
foreach | Sì (con &$value) | — | Iterazione generica con break/continue e pieno controllo del flusso |
array_reduce() | No | Un singolo valore | Ridurre un array a un unico risultato (somma, concatenazione, ecc.) |
Usa array_walk() quando vuoi mantenere lo stesso array e modificarne i valori in-place, o quando hai bisogno che ogni callback riceva sia il valore che la chiave. Scegli array_map() quando preferisci ottenere un nuovo array e lasciare invariata la sorgente.
Conclusione
array_walk() applica una callback a ogni elemento di un array in-place, risultando un modo pulito per trasformare valori, eseguire effetti collaterali per elemento, o elaborare coppie chiave/valore senza scrivere un ciclo esplicito. Ricorda di passare il valore per riferimento quando intendi modificarlo, usa array_walk_recursive() per gli array annidati, e preferisci array_map() quando vuoi costruire un nuovo array invece di modificare l'originale. Per ulteriori informazioni sull'iterazione degli array, consulta array PHP e il ciclo foreach.