La funzione array_filter() di PHP: Guida completa
La funzione array_filter() di PHP filtra gli elementi di un array tramite una callback. Scopri tutti i modi d'uso con esempi pratici.
array_filter() è una funzione PHP integrata che restituisce un nuovo array contenente solo gli elementi dell'array originale che superano un test da te definito. Le passi una callback — una funzione che restituisce true per mantenere un elemento e false per scartarlo — e array_filter() la esegue su ogni elemento.
Questa pagina spiega come funziona la funzione, tutte e tre le sue modalità (filtraggio per valore, per chiave, o per entrambi), la trappola che inganna la maggior parte dei principianti (le chiavi preservate) e la scorciatoia per rimuovere i valori "vuoti".
Come funziona array_filter()
array_filter() scorre l'array un elemento alla volta e chiama la tua callback su ciascuno:
- Se la callback restituisce un valore truthy, l'elemento viene mantenuto.
- Se restituisce un valore falsy, l'elemento viene scartato.
L'array originale non viene mai modificato — array_filter() costruisce e restituisce un nuovo array. Per impostazione predefinita, la callback riceve il valore dell'elemento (non la sua chiave).
Sintassi
array_filter(array $array, ?callable $callback = null, int $mode = 0): array$array— l'array da filtrare.$callback— la funzione di test. Opzionale: se omessa, ogni elemento uguale a un valore falsy (false,0,0.0,"","0",null,[]) viene rimosso.$mode— controlla cosa riceve la callback. Uno tra0(predefinito, il valore),ARRAY_FILTER_USE_KEYoARRAY_FILTER_USE_BOTH. Vedi Filtraggio per chiave.
Filtraggio con una callback personalizzata
L'uso più comune è filtrare in base a una condizione personalizzata. Qui manteniamo solo i numeri pari:
Output:
Array ( [1] => 2 [3] => 4 [5] => 6 )Nota le chiavi: gli elementi mantenuti conservano le loro chiavi originali (1, 3, 5), non vengono rinumerati. Questa è la sorpresa più grande con array_filter(). Vedi Reindicizzare il risultato qui sotto per la soluzione.
In PHP moderno puoi scrivere la callback come una concisa arrow function:
$evenNumbers = array_filter($numbers, fn ($number) => $number % 2 === 0);Usare una funzione integrata come callback
La callback può essere qualsiasi callable, inclusa una funzione integrata passata per nome. Qui is_numeric mantiene solo i valori numerici:
Output:
Array ( [0] => 1 [1] => 2 [3] => 4 [4] => 5 )La string '2' viene mantenuta perché is_numeric('2') è true, mentre 'three' viene scartata.
Rimozione dei valori vuoti (senza callback)
Chiama array_filter() con solo l'array per eliminare ogni elemento falsy — un modo rapido per ripulire un elenco di input opzionali:
<?php
$values = [0, 1, 2, '', '0', 'hello', null, false, []];
print_r(array_filter($values));
?>Output:
Array ( [1] => 1 [2] => 2 [5] => hello )Attenzione: questo rimuove 0, '0' e '' perché sono falsy. Se un 0 letterale o '0' è significativo nei tuoi dati, passa invece una callback esplicita, ad esempio fn ($v) => $v !== null.
Filtraggio per chiave o per entrambi
Per impostazione predefinita, la callback vede solo il valore. Passa l'argomento $mode per modificare questo comportamento:
ARRAY_FILTER_USE_KEY passa la chiave alla callback invece del valore:
<?php
$data = ['a' => 1, 'b' => 2, 'ab' => 3];
// Keep only single-letter keys
$result = array_filter($data, fn ($key) => strlen($key) === 1, ARRAY_FILTER_USE_KEY);
print_r($result);
?>Output:
Array ( [a] => 1 [b] => 2 )ARRAY_FILTER_USE_BOTH passa sia il valore che la chiave (prima il valore):
<?php
$data = ['a' => 1, 'b' => 2, 'c' => 3];
$result = array_filter($data, fn ($value, $key) => $value > 1 && $key !== 'c', ARRAY_FILTER_USE_BOTH);
print_r($result);
?>Output:
Array ( [b] => 2 )Reindicizzare il risultato
Poiché array_filter() preserva le chiavi, un array indicizzato può presentare lacune ([1], [3], [5]). Quando hai bisogno di un elenco pulito a base zero — ad esempio prima di codificarlo come array JSON — racchiudi il risultato in array_values():
<?php
$numbers = [1, 2, 3, 4, 5, 6];
$even = array_values(array_filter($numbers, fn ($n) => $n % 2 === 0));
print_r($even);
?>Output:
Array ( [0] => 2 [1] => 4 [2] => 6 )Quando usare array_filter()
- Usa
array_filter()quando vuoi un sottoinsieme di un array (eliminare gli elementi indesiderati). - Usa
array_map()quando vuoi trasformare ogni elemento mantenendo lo stesso numero di elementi. - Usa
array_reduce()quando vuoi ridurre un array a un singolo valore.
filter, map e reduce si combinano bene tra loro — filtra prima, poi mappa i superstiti.
Conclusione
array_filter() è il modo idiomatico per estrarre un sottoinsieme di un array in PHP. Ricorda i suoi due comportamenti chiave: l'array originale rimane intatto, e gli elementi sopravvissuti conservano le loro chiavi originali (usa array_values() per reindicizzare). Con la callback opzionale e le modalità ARRAY_FILTER_USE_KEY / ARRAY_FILTER_USE_BOTH, gestisce il filtraggio per valore, chiave o entrambi. Per saperne di più sugli array, consulta la panoramica sugli Array PHP.