W3docs

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 tra 0 (predefinito, il valore), ARRAY_FILTER_USE_KEY o ARRAY_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:

php— editable, runs on the server

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:

php— editable, runs on the server

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.

Esercizio

Pratica
Cosa fa la funzione array_filter() in PHP?
Cosa fa la funzione array_filter() in PHP?
Was this page helpful?