Menu

PHP array_filter(): filtrar un array por valor o por clave

array_filter($array, $callback) conserva los elementos para los que el callback devuelve true. Aprende a quitar valores vacíos, filtrar por clave con ARRAY_FILTER_USE_KEY, reindexar el resultado con array_values y sumar con array_reduce.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

array_filter($array, $callback) devuelve los elementos de $array para los que $callback devuelve true (o cualquier valor que se convierta en true). Primero va el array y después el callback, y los elementos que se quedan conservan sus claves originales.

Las claves del resultado son 1, 3, 5, 7: las posiciones que esos valores tenían en el array original. Ese detalle importa más de lo que parece, y la sección siguiente a la próxima muestra cómo tratarlo.

Quitar los valores vacíos de un array

Llama a array_filter sin callback y elimina todos los valores que se convierten en false: cadenas vacías, null, false, 0, "0" y arrays vacíos. Es la forma más rápida de limpiar los trozos de un explode() o una lista de campos de formulario.

El primer resultado también perdió "0" y 0, que a menudo son datos reales (una cantidad de cero, un dígito de un código postal). Cuando el cero sea una respuesta válida, escribe tú el callback, como en la segunda llamada. La página de empty tiene la lista completa de valores que PHP trata como vacíos.

Reindexar el resultado con array_values

Como se conservan las claves, una lista filtrada puede tener huecos. Un bucle for desde 0 se encuentra entonces con claves que faltan, y json_encode convierte el resultado en un objeto JSON en lugar de un array. array_values() lo renumera.

Filtrar por clave con ARRAY_FILTER_USE_KEY

El tercer argumento elige qué recibe el callback. ARRAY_FILTER_USE_KEY le pasa solo la clave. ARRAY_FILTER_USE_BOTH le pasa el valor y después la clave.

Para conservar un conjunto fijo de claves que ya conoces, array_intersect_key($config, array_flip(['db_host', 'db_port'])) hace lo mismo sin callback.

Filtrar un array multidimensional

La mayoría de los datos reales son una lista de filas. El callback recibe una fila cada vez, así que compruebas el campo que necesites.

Cambia $maxPrice y vuelve a ejecutarlo. Para obtener después solo los nombres, pasa el resultado a array_column: array_column($affordable, 'name').

Filtrar, luego mapear, luego reducir

array_filter elige elementos, array_map los cambia y array_reduce reduce el array a un solo valor. array_reduce($array, $callback, $initial) llama al callback con el total acumulado y el siguiente elemento.

Para una suma simple, array_sum($totals) es más corto. array_reduce se gana su sitio cuando el resultado es otra cosa: una cadena, un recuento por grupo, la fila más grande.

Error frecuente: cambiar valores dentro de array_filter

El valor que devuelve el callback solo decide si un elemento se queda. Todo lo demás que calcule se descarta, así que este código no recorta nada:

Transforma con array_map, luego filtra, y añade array_values cuando necesites una lista limpia.

Preguntas frecuentes

¿Cómo elimino los valores vacíos de un array en PHP?

Llama a array_filter($array) sin callback: descarta todos los valores falsy ("", null, false, 0, "0", []). Para descartar solo las cadenas vacías y null pero conservar 0, pasa un callback: array_filter($array, fn($v) => $v !== '' && $v !== null).

¿Por qué array_filter conserva las claves antiguas?

array_filter nunca renumera: los elementos que conserva se quedan bajo sus claves originales, así que una lista puede volver como [0 => 'a', 2 => 'c']. Envuélvelo en array_values() para volver a tener 0, 1, 2, lo que además hace que json_encode produzca un array JSON en lugar de un objeto.

¿Cómo filtro un array por clave en PHP?

Pasa ARRAY_FILTER_USE_KEY como tercer argumento, y el callback recibe la clave en lugar del valor: array_filter($arr, fn($k) => str_starts_with($k, 'db_'), ARRAY_FILTER_USE_KEY). Usa ARRAY_FILTER_USE_BOTH para recibir el valor y la clave.

¿Cuál es la diferencia entre array_filter y array_map?

array_filter decide qué elementos se quedan y los devuelve sin cambios. array_map cambia cada elemento y devuelve el mismo número de elementos. Para hacer las dos cosas, encadénalas: array_map('strtoupper', array_filter($arr)).

Ilustración de los lenguajes de programación de Coddy

Aprende a programar con Coddy

COMENZAR