filter_input_array()
Aprende cómo filter_input_array() de PHP valida y sanea una solicitud GET o POST completa de una vez: sintaxis, opciones por campo, flags y resultados false vs null.
Introducción
filter_input_array() filtra un lote completo de entrada externa — cada campo de una solicitud $_GET o $_POST — en una sola llamada, en lugar de extraer valores de las superglobales uno por uno. Se le proporciona una definición que mapea cada campo esperado a un filtro (validar o sanear), y devuelve un array de valores limpiados y verificados por tipo.
Esta página cubre la sintaxis, cómo leer el resultado (la diferencia entre false, null y una clave ausente), cómo adjuntar opciones y flags a campos individuales, y cómo filter_input_array() se compara con sus funciones hermanas de valor único y array arbitrario.
Para una visión más amplia de la extensión de filtros de PHP, consulta PHP Filters y PHP Advanced Filters.
Sintaxis
filter_input_array(int $type, array|int $options = FILTER_DEFAULT, bool $add_empty = true): array|false|null| Parámetro | Significado |
|---|---|
$type | Qué fuente de entrada leer: INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER o INPUT_ENV. |
$options | Un ID de filtro único aplicado a todos los campos, o un array asociativo que mapea cada nombre de campo a su propio filtro / definición (el caso habitual). |
$add_empty | Cuando es true (valor por defecto), los campos nombrados en la definición pero ausentes en la entrada aparecen en el resultado como null. Ponlo a false para omitirlos. |
Valor de retorno:
- Un array de valores filtrados si tiene éxito.
falsesi$typeno es válido.nullsi la fuente de entrada solicitada no tiene datos en absoluto (y$add_emptyesfalse).
La parte crucial es leer las entradas individuales, no el valor de retorno general:
| Resultado por campo | Significado |
|---|---|
| El valor limpiado | El campo pasó su filtro. |
false | Un filtro de validación rechazó el valor (p. ej. "abc" para FILTER_VALIDATE_INT). |
null | El campo estaba nombrado en la definición pero no estaba presente en la entrada. |
Un ejemplo autocontenido
filter_input_array() lee de las fuentes reales INPUT_POST / INPUT_GET, que solo existen durante una solicitud web. Para demostrar las definiciones de filtro de una manera que puedas ejecutar en la línea de comandos, el fragmento a continuación utiliza filter_var_array() — acepta exactamente la misma definición $filters y aplica el mismo motor, por lo que la salida es idéntica a lo que filter_input_array(INPUT_POST, $filters) produciría para esos datos.
<?php
// In a real request this array would be $_POST.
$input = [
'name' => '<b>Jane</b>',
'age' => '30',
'email' => '[email protected]',
];
$filters = [
'name' => FILTER_SANITIZE_FULL_SPECIAL_CHARS, // sanitize: escape HTML
'age' => FILTER_VALIDATE_INT, // validate: must be an int
'email' => FILTER_VALIDATE_EMAIL, // validate: must be an email
];
$data = filter_var_array($input, $filters);
// In a controller you would write:
// $data = filter_input_array(INPUT_POST, $filters);
print_r($data);Salida:
Array
(
[name] => <b>Jane</b>
[age] => 30
[email] => [email protected]
)Observa que name fue saneado (las etiquetas fueron escapadas) mientras que age y email fueron validados (devueltos como un int real y un string verificado). Un campo que no está listado en $filters se descarta completamente del resultado.
Manejo de campos inválidos y ausentes
Dado que una validación fallida produce false y un campo ausente produce null, nunca asumas que cada entrada es utilizable. Comprueba antes de confiar en los datos:
<?php
$input = [
'age' => 'not-a-number',
'email' => 'bad-email',
];
$filters = [
'age' => FILTER_VALIDATE_INT,
'email' => FILTER_VALIDATE_EMAIL,
'missing' => FILTER_VALIDATE_INT, // declared, but absent from input
];
$data = filter_var_array($input, $filters);
print_r($data);Salida:
Array
(
[age] =>
[email] =>
[missing] =>
)print_r no muestra nada después de las claves porque age y email son false (inválidos) y missing es null (ausente). En código real, distingue entre ellos explícitamente:
<?php
if ($data['age'] === false) {
echo "Age is not a valid integer.";
} elseif ($data['age'] === null) {
echo "Age was not submitted.";
} else {
echo "Age is {$data['age']}.";
}Opciones y flags por campo
En lugar de una constante de filtro simple, un campo puede ser un array anidado con las claves filter, options y flags — aquí es donde la función se vuelve poderosa. Usa options para cosas como un rango de enteros, y el flag FILTER_REQUIRE_ARRAY cuando un campo llega como array (p. ej. una selección múltiple o name="tags[]").
<?php
$input = [
'age' => '200',
'tags' => ['<a>', '<b>'],
];
$args = [
'age' => [
'filter' => FILTER_VALIDATE_INT,
'options' => ['min_range' => 0, 'max_range' => 120],
],
'tags' => [
'filter' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
'flags' => FILTER_REQUIRE_ARRAY, // apply the filter to each element
],
];
print_r(filter_var_array($input, $args));Salida:
Array
(
[age] =>
[tags] => Array
(
[0] => <a>
[1] => <b>
)
)age es false porque 200 está fuera del rango 0–120, y cada elemento de tags fue saneado individualmente gracias a FILTER_REQUIRE_ARRAY.
Comparación con funciones relacionadas
| Función | Lee de | Forma de entrada |
|---|---|---|
filter_input() | Superglobal INPUT_* | un único campo |
filter_input_array() | Superglobal INPUT_* | un array de solicitud completo |
filter_var() | Una variable que pasas | un valor único |
filter_var_array() | Una variable que pasas | un array que pasas |
Usa filter_input_array() cuando los datos residan en $_GET/$_POST/etc.; usa filter_var_array() cuando ya tengas el array en una variable.
Compatibilidad de versiones de PHP
FILTER_SANITIZE_STRING fue deprecado en PHP 8.1 y eliminado en PHP 8.2. Para el saneado de strings en PHP moderno, usa FILTER_SANITIZE_FULL_SPECIAL_CHARS (como en los ejemplos anteriores) o, para validación, un filtro dedicado como FILTER_VALIDATE_EMAIL.
Por qué usarlo
- Seguridad. Filtrar toda la solicitud en un solo lugar evita que los valores no validados se filtren en consultas o marcado. Combínalo con validación de formularios y sentencias preparadas.
- Legibilidad. La definición
$filtersactúa como un esquema para la entrada esperada, separando las reglas de validación de la lógica de negocio. - Consistencia. Cada campo pasa por el mismo motor verificado, por lo que no tienes que escribir comprobaciones
isset()+is_numeric()manualmente por campo.
Consulta también PHP Superglobals para saber de dónde proviene esta entrada.