array_map($callback, $array) chiama $callback su ogni elemento di $array e restituisce un nuovo array con i risultati. Prima la callback, poi l'array, e l'array originale resta invariato.
fn($p) => $p * 1.2 è una arrow function: una funzione di una sola espressione che restituisce il suo risultato. Al suo posto funziona qualsiasi callable.
Usare una funzione predefinita come callback
Passa il nome di una funzione predefinita come stringa. È il modo più breve per ripulire un intero array: applicare trim a ogni valore, convertire stringhe in interi o cambiare maiuscole e minuscole.
array_map('intval', ...) è il modo consueto per trasformare in veri interi le stringhe arrivate da un form o da explode(). Puoi anche scrivere intval(...), la sintassi first-class callable di PHP 8.1, che il tuo editor può completare e controllare.
Usare una closure con variabili esterne
Una arrow function vede automaticamente le variabili intorno a sé. Una function classica ha bisogno di use per portarle dentro. Entrambe sono spiegate nella pagina sulle funzioni anonime.
array_map con le chiavi
Con un solo array, array_map mantiene le chiavi, comprese quelle stringa. Ma la callback riceve solo il valore. Per avere anche la chiave, passa array_keys($array) come secondo array: la callback viene allora chiamata con un elemento di ciascun array.
Nota il secondo risultato: appena passi più di un array, le chiavi vengono sostituite da 0, 1, 2. Ecco perché l'ultima riga usa array_combine() per ricostruirle.
Map di più array insieme
Ogni array in più diventa un argomento in più per la callback, abbinato per posizione. Se gli array hanno lunghezze diverse, quelli più corti vengono completati con null.
Passare null come callback salta la funzione e accoppia gli array:
array_map vs array_walk vs foreach
array_map costruisce un nuovo array. array_walk modifica l'array che gli passi, tramite un riferimento, e dà alla callback la chiave come secondo argomento. Un foreach fa l'una o l'altra cosa e può anche saltare elementi o fermarsi prima con break.
Usa array_map quando ogni elemento diventa esattamente un nuovo elemento. Se devi anche scartare alcuni elementi, combinala con array_filter, oppure scrivi un foreach.
Errore comune: l'ordine degli argomenti
array_map accetta prima la callback e poi l'array. La sua vicina array_filter li accetta al contrario, ed è facile confonderle:
array_map($callback, $array); // callback first
array_filter($array, $callback); // array first
Scambiarli fa lanciare a PHP 8 un TypeError, perché un semplice array non è una callback valida:
PHP si ferma con:
PHP Fatal error: Uncaught TypeError: array_map(): Argument #1 ($callback) must be a valid callback or null, array callback must have exactly two members in /home/index.php:4
Rimetti i due argomenti nell'ordine giusto e il blocco viene eseguito.
Domande frequenti
Cosa fa array_map in PHP?
Chiama una funzione su ogni elemento di un array e restituisce un nuovo array con i risultati: array_map(fn($n) => $n * 2, [1, 2, 3]) restituisce [2, 4, 6]. L'array originale non viene modificato.
array_map mantiene le chiavi?
Con un solo array sì: le chiavi stringa e intere restano come sono. Con due o più array, il risultato riceve sempre nuove chiavi 0, 1, 2....
Come ottengo la chiave dentro la callback di array_map?
Passa le chiavi come secondo array: array_map(fn($k, $v) => "$k=$v", array_keys($arr), $arr). Il risultato è una lista, quindi racchiudilo in array_combine(array_keys($arr), ...) se ti servono di nuovo le chiavi originali.
array_map è più veloce di foreach?
Non in modo significativo. Entrambi scorrono l'array una volta, e un semplice foreach è spesso un po' più veloce perché evita una chiamata di funzione per elemento. Scegli array_map quando si legge meglio: una trasformazione che produce un nuovo array.
Qual è la differenza tra array_map e array_walk?
array_map restituisce un nuovo array e lascia intatto l'input. array_walk restituisce true e serve a modificare l'array sul posto tramite un parametro per riferimento: array_walk($arr, function (&$v, $k) { $v = trim($v); });.