W3docs

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 ser 0 (valor predeterminado), ARRAY_FILTER_USE_KEY o ARRAY_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:

php— editable, runs on the server

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:

php— editable, runs on the server

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.

Práctica

Práctica
¿Qué hace la función array_filter() en PHP?
¿Qué hace la función array_filter() en PHP?
Was this page helpful?