array_filter($array, $callback) renvoie les éléments de $array pour lesquels $callback renvoie true (ou toute valeur convertie en true). Le tableau vient en premier, le callback en second, et les éléments qui restent gardent leurs clés d'origine.
Les clés du résultat sont 1, 3, 5, 7 : les positions qu'avaient ces valeurs dans le tableau d'origine. Ce détail compte plus qu'il n'y paraît, et la section d'après la suivante montre comment le gérer.
Supprimer les valeurs vides d'un tableau
Appelez array_filter sans callback et elle supprime toutes les valeurs converties en false : chaînes vides, null, false, 0, "0" et tableaux vides. C'est la façon la plus rapide de nettoyer les morceaux d'un explode() ou une liste de champs de formulaire.
Le premier résultat a aussi perdu "0" et 0, qui sont souvent de vraies données (une quantité nulle, un chiffre de code postal). Quand zéro est une réponse valide, écrivez vous-même le callback, comme dans le second appel. La page empty donne la liste complète des valeurs que PHP considère comme vides.
Réindexer le résultat avec array_values
Comme les clés sont gardées, une liste filtrée peut avoir des trous. Une boucle for depuis 0 tombe alors sur des clés manquantes, et json_encode transforme le résultat en objet JSON au lieu d'un tableau. array_values() le renumérote.
Filtrer par clé avec ARRAY_FILTER_USE_KEY
Le troisième argument choisit ce que reçoit le callback. ARRAY_FILTER_USE_KEY ne passe que la clé. ARRAY_FILTER_USE_BOTH passe la valeur puis la clé.
Pour garder un ensemble fixe de clés que vous connaissez déjà, array_intersect_key($config, array_flip(['db_host', 'db_port'])) fait la même chose sans callback.
Filtrer un tableau multidimensionnel
La plupart des vraies données sont une liste de lignes. Le callback reçoit une ligne à la fois, vous testez donc le champ dont vous avez besoin.
Modifiez $maxPrice et relancez. Pour obtenir ensuite seulement les noms, passez le résultat à array_column : array_column($affordable, 'name').
Filtrer, puis mapper, puis réduire
array_filter choisit des éléments, array_map les modifie, et array_reduce ramène le tableau à une seule valeur. array_reduce($array, $callback, $initial) appelle le callback avec le total en cours et l'élément suivant.
Pour une simple somme, array_sum($totals) est plus court. array_reduce se justifie quand le résultat est autre chose : une chaîne, un compte par groupe, la plus grande ligne.
Erreur fréquente : modifier des valeurs dans array_filter
La valeur de retour du callback décide seulement si un élément reste. Tout ce qu'il calcule d'autre est jeté, donc ce code n'applique trim à rien :
Transformez avec array_map, puis filtrez, et ajoutez array_values quand il vous faut une liste propre.
Questions fréquentes
Comment supprimer les valeurs vides d'un tableau en PHP ?
Appelez array_filter($array) sans callback : elle supprime toutes les valeurs évaluées à faux ("", null, false, 0, "0", []). Pour ne supprimer que les chaînes vides et null mais garder 0, passez un callback : array_filter($array, fn($v) => $v !== '' && $v !== null).
Pourquoi array_filter garde-t-elle les anciennes clés ?
array_filter ne renumérote jamais : les éléments qu'elle garde restent sous leurs clés d'origine, donc une liste peut revenir sous la forme [0 => 'a', 2 => 'c']. Entourez-la d'array_values() pour retrouver 0, 1, 2, ce qui fait aussi produire un tableau JSON à json_encode au lieu d'un objet.
Comment filtrer un tableau par clé en PHP ?
Passez ARRAY_FILTER_USE_KEY en troisième argument, et le callback reçoit la clé au lieu de la valeur : array_filter($arr, fn($k) => str_starts_with($k, 'db_'), ARRAY_FILTER_USE_KEY). Utilisez ARRAY_FILTER_USE_BOTH pour recevoir la valeur et la clé.
Quelle est la différence entre array_filter et array_map ?
array_filter décide quels éléments restent et les renvoie inchangés. array_map modifie chaque élément et renvoie le même nombre d'éléments. Pour faire les deux, enchaînez-les : array_map('strtoupper', array_filter($arr)).