La función array_filter() de PHP: Guía completa
Guía completa sobre array_filter() en PHP: filtra elementos de un array con un callback, por clave o por ambos, y elimina valores vacíos.
array_filter() es una función integrada de PHP que devuelve un nuevo array con solo los elementos del array original que superan una prueba que tú defines. Le pasas un callback — una función que devuelve true para conservar un elemento y false para descartarlo — y array_filter() lo ejecuta sobre cada elemento.
Esta página explica cómo funciona la función, sus tres modos (filtrar por valor, por clave o por ambos), el error más común entre principiantes (las claves preservadas) y el atajo para eliminar valores "vacíos".
Cómo funciona array_filter()
array_filter() recorre el array elemento por elemento y llama a tu callback en cada uno:
- Si el callback devuelve un valor truthy, el elemento se conserva.
- Si devuelve un valor falsy, el elemento se descarta.
El array original nunca se modifica — array_filter() construye y devuelve un array nuevo. Por defecto, el callback recibe el valor del elemento (no su clave).
Sintaxis
array_filter(array $array, ?callable $callback = null, int $mode = 0): array$array— el array a filtrar.$callback— la función de prueba. Opcional: si se omite, se elimina todo elemento igual a un valor falsy (false,0,0.0,"","0",null,[]).$mode— controla qué recibe el callback. Puede ser0(valor predeterminado),ARRAY_FILTER_USE_KEYoARRAY_FILTER_USE_BOTH. Consulta Filtrar por clave.
Filtrar con un callback personalizado
El uso más habitual es filtrar con una condición personalizada. Aquí conservamos solo los números pares:
Salida:
Array ( [1] => 2 [3] => 4 [5] => 6 )Fíjate en las claves: los elementos conservados mantienen sus claves originales (1, 3, 5), no se renumeran. Esta es la mayor sorpresa de array_filter(). Consulta Reindexar el resultado más abajo para solucionarlo.
En PHP moderno puedes escribir el callback como una función flecha concisa:
$evenNumbers = array_filter($numbers, fn ($number) => $number % 2 === 0);Usar una función integrada como callback
El callback puede ser cualquier callable, incluida una función integrada pasada por nombre. Aquí is_numeric conserva solo los valores numéricos:
Salida:
Array ( [0] => 1 [1] => 2 [3] => 4 [4] => 5 )El string '2' se conserva porque is_numeric('2') es true, mientras que 'three' se descarta.
Eliminar valores vacíos (sin callback)
Llama a array_filter() con solo el array para eliminar todos los elementos falsy — una forma rápida de limpiar una lista de entradas opcionales:
<?php
$values = [0, 1, 2, '', '0', 'hello', null, false, []];
print_r(array_filter($values));
?>Salida:
Array ( [1] => 1 [2] => 2 [5] => hello )Ten cuidado: esto elimina 0, '0' y '' porque son falsy. Si un 0 o '0' literal tiene significado en tus datos, pasa un callback explícito, por ejemplo fn ($v) => $v !== null.
Filtrar por clave o por ambos
Por defecto el callback solo ve el valor. Pasa el argumento $mode para cambiarlo:
ARRAY_FILTER_USE_KEY pasa la clave al callback en lugar del valor:
<?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);
?>Salida:
Array ( [a] => 1 [b] => 2 )ARRAY_FILTER_USE_BOTH pasa tanto el valor como la clave (primero el valor):
<?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);
?>Salida:
Array ( [b] => 2 )Reindexar el resultado
Dado que array_filter() preserva las claves, un array indexado puede quedar con huecos ([1], [3], [5]). Cuando necesitas una lista limpia con índice base cero — por ejemplo, antes de codificarla como array JSON — envuelve el resultado con array_values():
<?php
$numbers = [1, 2, 3, 4, 5, 6];
$even = array_values(array_filter($numbers, fn ($n) => $n % 2 === 0));
print_r($even);
?>Salida:
Array ( [0] => 2 [1] => 4 [2] => 6 )Cuándo usar array_filter()
- Usa
array_filter()cuando quieras un subconjunto de un array (descartar los elementos que no necesitas). - Usa
array_map()cuando quieras transformar cada elemento pero mantener el mismo número. - Usa
array_reduce()cuando quieras reducir un array a un único valor.
filter, map y reduce se combinan bien — primero filtra, luego transforma los supervivientes.
Conclusión
array_filter() es la forma idiomática de extraer un subconjunto de un array en PHP. Recuerda sus dos comportamientos clave: el array original no se modifica, y los elementos supervivientes conservan sus claves originales (usa array_values() para reindexar). Con el callback opcional y los modos ARRAY_FILTER_USE_KEY / ARRAY_FILTER_USE_BOTH, maneja el filtrado por valor, por clave o por ambos. Para más información sobre el trabajo con arrays, consulta la descripción general de Arrays en PHP.