filter_var_array

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

filter_var_arrayRécupère plusieurs variables et les filtre

Description

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

Filtrer un tableau associatif de valeurs en utilisant un filtre de validation FILTER_VALIDATE_*, un filtre de purification FILTER_SANITIZE_*, ou un filtre personnalisé.

Liste de paramètres

array

Un tableau associatif contenant les données à filtrer.

options

Soit un array associatif d'options, soit un filtre à appliquer à chaque entrée, qui peut être un filtre de validation en utilisant une des constantes FILTER_VALIDATE_*, ou un filtre de purification en utilisant une des constantes FILTER_SANITIZE_*.

Le tableau d'options est un tableau associatif où les clés correspondent à une clé dans le tableau d'entrée et la valeur associée est soit le filtre à appliquer à cette entrée, soit un tableau associatif qui décrit comment et quel filtre devrait être appliqué à cette entrée.

Le tableau associatif qui décrit comment un filtre devrait être appliqué doit contenir la clé 'filter' dont sa valeur associée est le filtre à appliquer, qui peut être une des constantes FILTER_VALIDATE_*, FILTER_SANITIZE_*, FILTER_UNSAFE_RAW, ou FILTER_CALLBACK. Il peut contenir facultativement la clé 'flags' qui spécifie tout drapeau qui s'applique au filtre, et la clé 'options' qui spécifie toute option qui s'applique au filtre.

add_empty

Ajoute les clés manquantes en tant que null dans la valeur de retour.

Valeurs de retour

En cas de succès, un tableau contenant les valeurs des variables demandées.

En cas d'échec, false est retourné.

Les entrées manquantes du tableau d'entrée sont ajoutées au tableau retourné avec la valeur null si add_empty vaut true, et sont entièrement omises s'il vaut false.

Une entrée dans le tableau retourné sera false si le filtre échoue, sauf si le drapeau FILTER_NULL_ON_FAILURE est utilisé, auquel cas il sera null. Avec le drapeau FILTER_FORCE_ARRAY, cette valeur d'échec est enveloppée dans un tableau d'un seul élément, comme n'importe quel autre résultat.

Exemples

Exemple #1 Exemple avec filter_var_array()

Les entrées sont filtrées comme des scalaires à moins que FILTER_REQUIRE_ARRAY ou FILTER_FORCE_ARRAY ne soit utilisé. Le drapeau FILTER_REQUIRE_SCALAR sur testscalar ci-dessous ne fait donc qu'expliciter ce comportement par défaut.

<?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));

?>

L'exemple ci-dessus va afficher :

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
}

Exemple #2 Application d'un filtre unique à toutes les valeurs

Lorsque options est un entier, le même filtre est appliqué à chaque entrée du tableau.

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

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

L'exemple ci-dessus va afficher :

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"
}

Exemple #3 Utilisation 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));
?>

L'exemple ci-dessus va afficher :

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

Voir aussi

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')