W3docs

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
ParametroObbligatorioDescrizione
$arrayL'array su cui iterare. Viene passato per riferimento, quindi la callback può modificarne gli elementi.
$callbackUn 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) { ... }.
$argNoUn 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 $value per riferimento? Senza il simbolo &, la callback riceve una copia di ogni elemento, quindi qualsiasi modifica viene scartata. Aggiungendo & (come in function (&$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

php— editable, runs on the server

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

php— editable, runs on the server

Output:

The total sum is: 15

In 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

php— editable, runs on the server

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 con array_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, usa array_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 = null dentro la callback, o modificare la struttura dell'array durante lo scorrimento, porta a comportamenti indefiniti. Usa array_walk() solo per trasformare i valori in-place.

array_walk() vs. array_map() vs. foreach

StrumentoModifica in-place?RestituisceIdeale per
array_walk()Sì (tramite riferimento)trueMutare un array esistente o eseguire un effetto collaterale per ogni elemento
array_map()NoUn nuovo arrayProdurre una copia trasformata senza toccare l'originale
foreachSì (con &$value)Iterazione generica con break/continue e pieno controllo del flusso
array_reduce()NoUn singolo valoreRidurre 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.

Esercitati

Pratica
Qual è la funzionalità della funzione 'array_walk()' in PHP?
Qual è la funzionalità della funzione 'array_walk()' in PHP?
Was this page helpful?