filter_var_array

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

filter_var_arrayObtiene múltiple variables y opcionalmente las filtra

Descripción

function filter_var_array(array $array, array|int $options = FILTER_DEFAULT, bool $add_empty = true): array|false|null

Valida un array asociativo de valores usando los filtros de validación FILTER_VALIDATE_*, filtros de saneación FILTER_SANITIZE_*, o filtros definidos por el usuario

Parámetros

array

Un array asociativo que contiene los datos a filtrar.

options

Ya sea un array asociativo de opciones, o el filtro que se aplicará a cada entrada, que puede ser un filtro de validación mediante el uso de una de las constantes FILTER_VALIDATE_* o un filtro de saneamiento mediante el uso de una de las constantes FILTER_SANITIZE_*.

La array de opciones es un array asociativo donde la clave corresponde a una clave del array de entrada y el valor asociado es el filtro a aplicar a esta entrada, o un array asociativo que describe cómo y qué filtro se debe aplicar a esta entrada.

El array asociativo que describe cómo se debe aplicar un filtro debe contener la clave 'filter' cuyo valor asociado es el filtro a aplicar, que puede ser uno de las constantes FILTER_VALIDATE_*, FILTER_SANITIZE_*, FILTER_UNSAFE_RAW, o FILTER_CALLBACK. Opcionalmente, puede contener la clave 'flags', que especifica cualquier flag que se aplique al filtro, y la clave 'options', que especifica las opciones que se aplican al filtro.

add_empty

Añade claves faltantes como null al valor devuelto.

Valores devueltos

En caso de éxito, un array que contiene los valores de las variables solicitadas.

En caso de fallo, se devuelve false.

Las entradas faltantes del array de entrada se añaden al array devuelto como null si add_empty es true, y se omiten por completo si es false.

Un valor del array devuelto será false si el filtro falla, a menos que se use el flag FILTER_NULL_ON_FAILURE, en cuyo caso será null. Con el flag FILTER_FORCE_ARRAY, ese valor de fallo se envuelve en un array de un solo elemento como cualquier otro resultado.

Ejemplos

Ejemplo #1 Ejemplo de filter_var_array()

Las entradas se filtran como escalares a menos que se use FILTER_REQUIRE_ARRAY o FILTER_FORCE_ARRAY. Por lo tanto, el flag FILTER_REQUIRE_SCALAR en testscalar, a continuación, solo indica ese comportamiento por defecto de forma explícita.

<?php

$data = [
    'product_id' => 'libgd<script>',
    'component'  => '10',
    'versions'   => '2.0.33',
    'testscalar' => ['2', '23', '10', '12'],
    'testarray'  => '2',
];

$filters = [
    'product_id'   => FILTER_SANITIZE_ENCODED,
    'component'    => [
        'filter'   => FILTER_VALIDATE_INT,
        'flags'    => FILTER_FORCE_ARRAY,
        'options'  => [
            'min_range' => 1,
            'max_range' => 10,
        ],
    ],
    'versions'     => [
        'filter' => FILTER_SANITIZE_ENCODED
    ],
    'testscalar'   => [
        'filter' => FILTER_VALIDATE_INT,
        'flags'  => FILTER_REQUIRE_SCALAR,
    ],
    'testarray'    => [
        'filter' => FILTER_VALIDATE_INT,
        'flags'  => FILTER_FORCE_ARRAY,
    ],
    'doesnotexist' => FILTER_VALIDATE_INT,
];

var_dump(filter_var_array($data, $filters));

?>

El ejemplo anterior mostrará:

array(6) {
  ["product_id"]=>
  string(17) "libgd%3Cscript%3E"
  ["component"]=>
  array(1) {
    [0]=>
    int(10)
  }
  ["versions"]=>
  string(6) "2.0.33"
  ["testscalar"]=>
  bool(false)
  ["testarray"]=>
  array(1) {
    [0]=>
    int(2)
  }
  ["doesnotexist"]=>
  NULL
}

Ejemplo #2 Aplicación de un único filtro a todos los valores

Cuando options es un int, se aplica el mismo filtro a cada entrada del array.

<?php
$data = [
    'name'  => '<b>John</b>',
    'email' => 'john@example<script>.com',
    'bio'   => 'Developer & writer',
];

var_dump(filter_var_array($data, FILTER_SANITIZE_SPECIAL_CHARS));
?>

El ejemplo anterior mostrará:

array(3) {
  ["name"]=>
  string(27) "&#60;b&#62;John&#60;/b&#62;"
  ["email"]=>
  string(32) "john@example&#60;script&#62;.com"
  ["bio"]=>
  string(22) "Developer &#38; writer"
}

Ejemplo #3 Uso de FILTER_CALLBACK

<?php
$data = [
    'name'  => '  John Doe  ',
    'city'  => '  New York  ',
];

$options = [
    'name' => [
        'filter'  => FILTER_CALLBACK,
        'options' => 'trim',
    ],
    'city' => [
        'filter'  => FILTER_CALLBACK,
        'options' => function ($value) {
            return strtoupper(trim($value));
        },
    ],
];

var_dump(filter_var_array($data, $options));
?>

El ejemplo anterior mostrará:

array(2) {
  ["name"]=>
  string(8) "John Doe"
  ["city"]=>
  string(8) "NEW YORK"
}

Véase también

add a note

User Contributed Notes 5 notes

up
4
Anonymous
3 years ago
To apply the same filter to many params/keys, use array_fill_keys().

<?php
$data = array(
    'product_id'    => 'libgd<script>',
    'component'     => '    10    ',
    'versions'      => '2.0.33',
    'testscalar'    => array('2', '23', '10', '12'),
    'testarray'     => '2',
);
$keys = array(
    'product_id',
    'component',
    'versions',
    'doesnotexist',
    'testscalar',
    'testarray'
);
$options = array(
    'filter' => FILTER_CALLBACK,
    'options' => function ($value) {
        return trim(strip_tags($value));
    },
);
$args = array_fill_keys($keys, $options);
/* Result
$args = array(
    'product_id' => array(
        'filter' => FILTER_CALLBACK,
        'options' => function ($value) {
            return trim(strip_tags($value));
        },
    ),
    'component' => array(
        'filter' => FILTER_CALLBACK,
        'options' => function ($value) {
            return trim(strip_tags($value));
        },
    ),
    'versions' => array(
        'filter' => FILTER_CALLBACK,
        'options' => function ($value) {
            return trim(strip_tags($value));
        },
    ),
    'doesnotexist' => array(
        'filter' => FILTER_CALLBACK,
        'options' => function ($value) {
            return trim(strip_tags($value));
        },
    ),
    'testscalar' => array(
        'filter' => FILTER_CALLBACK,
        'options' => function ($value) {
            return trim(strip_tags($value));
        },
    ),
    'testarray' => array(
        'filter' => FILTER_CALLBACK,
        'options' => function ($value) {
            return trim(strip_tags($value));
        },
    ),
);
*/

$myinputs = filter_var_array($data, $args);
var_dump($myinputs);

Output:

array(6) {
  'product_id' =>
  string(5) "libgd"
  'component' =>
  string(2) "10"
  'versions' =>
  string(6) "2.0.33"
  'doesnotexist' =>
  NULL
  'testscalar' =>
  array(4) {
    [0] =>
    string(1) "2"
    [1] =>
    string(2) "23"
    [2] =>
    string(2) "10"
    [3] =>
    string(2) "12"
  }
  'testarray' =>
  string(1) "2"
}
up
7
eguvenc at gmail dot com
17 years ago
<?php
//an example of simply sanitize an array..

$data = array(
                '<b>bold</b>',
                '<script>javascript</script>',
                'P*}i@893746%%%p*.i.*}}|.dw<?php echo "echo works!!";?>');

$myinputs = filter_var_array($data,FILTER_SANITIZE_STRING);

var_dump($myinputs);

//OUTPUT:
//formarray(3) { [0]=> string(4) "bold" [1]=> string(10) "javascript" [2]=> string(26) "P*}i@893746%%%p*.i.*}}|.dw" }
?>
up
0
masakielastic at gmail dot com
1 month ago
For Web API input validation, it can be useful to separate the application-level validation specification from the low-level PHP filtering API.

Some projects use schema validation libraries to keep validation rules independent from the code that actually executes the validation. The same idea can be applied in a small form with filter_var_array(): define field names and rule names in one array, then convert those rule names into PHP filter descriptors.

<?php

$input = [
    'email' => 'taro@example.com', // valid
    'quantity' => '0',             // invalid: less than 1
];

// Application-level specification.
// It maps input field names to application rule names.
$app_spec = [
    'email' => 'email',
    'quantity' => 'quantity',
];

$filter_descriptors = build_filter_descriptors($app_spec);

$result = filter_var_array($input, $filter_descriptors);

var_dump($result);

function build_filter_descriptors(array $app_spec): array
{
    $filter_descriptors = [];

    foreach ($app_spec as $field => $rule_name) {
        $filter_descriptors[$field] = filter_descriptor_for_rule($rule_name);
    }

    return $filter_descriptors;
}

function filter_descriptor_for_rule(string $rule_name): array
{
    return match ($rule_name) {
        'email' => [
            'filter' => FILTER_VALIDATE_EMAIL,
        ],
        'quantity' => [
            'filter' => FILTER_VALIDATE_INT,
            'options' => [
                'min_range' => 1,
                'max_range' => 10,
            ],
        ],
    };
}
up
0
masakielastic at gmail dot com
1 month ago
FILTER_THROW_ON_FAILURE can be used in each filter descriptor by adding it to the "flags" entry.

<?php

$data = [
    'email' => 'not an email',
    'age' => '20',
];

$filters = [
    'email' => [
        'filter' => FILTER_VALIDATE_EMAIL,
        'flags' => FILTER_THROW_ON_FAILURE,
    ],
    'age' => [
        'filter' => FILTER_VALIDATE_INT,
        'flags' => FILTER_THROW_ON_FAILURE,
        'options' => [
            'min_range' => 0,
            'max_range' => 120,
        ],
    ],
];

try {
    $result = filter_var_array($data, $filters);
} catch (Filter\FilterFailedException $e) {
    echo $e->getMessage(), "\n";
}

?>

When using filter_var_array(), the exception message does not identify which array key failed validation. If you need field-specific validation errors for a form or Web API response, validating each field separately with filter_var() may be easier to handle.

Also note that FILTER_THROW_ON_FAILURE and FILTER_NULL_ON_FAILURE should not be used together.
up
-2
Vee W.
7 years ago
$emails = [
    'a' => 'email1@domain.com',
    'b' => '<email2>@domain.com',
];

$result = filter_var_array($emails, FILTER_SANITIZE_EMAIL);
print_r($result);

// the result will be...
// array('a' => 'email1@domain.com', 'b' => 'email2@domain.com')