W3docs

filter_var_array()

PHP предоставляет встроенную функцию filter_var_array() для фильтрации и валидации пользовательских данных сразу для нескольких переменных.

Введение

PHP предоставляет широкий набор встроенных функций для фильтрации и валидации пользовательских входных данных. Одной из таких функций является filter_var_array(), которая применяет фильтры сразу ко многим переменным, вместо того чтобы многократно вызывать filter_var(). Это главный инструмент для чистой обработки форм: вы описываете правила для каждого поля в одном array, передаёте в него необработанные входные данные и получаете полностью проверенный и очищенный результат.

В этой главе рассматриваются синтаксис, три способа задания фильтров, поведение флага $add_empty, порядок чтения возвращаемого значения и распространённые подводные камни — с рабочими примерами.

Синтаксис

Синтаксис filter_var_array() выглядит следующим образом:

Синтаксис PHP для filter_var_array()

filter_var_array ( array $data , mixed $definition [, bool $add_empty = true ] ) : mixed
ПараметрОписание
$dataАссоциативный array входных значений для фильтрации (например, $_POST или $_GET).
$definitionСпособ фильтрации. Либо одна константа фильтра, применяемая ко всем значениям, либо array, сопоставляющий каждый ключ с его собственным фильтром и параметрами.
$add_emptyЕсли true (по умолчанию), ключи, присутствующие в $definition, но отсутствующие в $data, добавляются в результат со значением null. Если false, они пропускаются.

Функция возвращает отфильтрованный array в случае успеха или false при ошибке (например, если $data не является array).

Три способа задания фильтров

Параметр $definition — это сердце данной функции. Он может принимать три формы.

1. Один фильтр для всех значений — передайте одну константу фильтра:

<?php
$data = ['a' => '1', 'b' => 'not-a-number', 'c' => '42'];
$result = filter_var_array($data, FILTER_VALIDATE_INT);
print_r($result);

Вывод — значения, не прошедшие фильтр, становятся false:

Array
(
    [a] => 1
    [b] =>
    [c] => 42
)

2. Карта фильтров для каждого ключа — сопоставьте каждый ключ с собственной константой фильтра:

<?php
$data = [
    'name'  => '  John  ',
    'age'   => '30',
    'email' => '[email protected]',
];

$definition = [
    'name'  => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
    'age'   => FILTER_VALIDATE_INT,
    'email' => FILTER_VALIDATE_EMAIL,
];

print_r(filter_var_array($data, $definition));
Array
(
    [name] =>   John  
    [age] => 30
    [email] => [email protected]
)

3. Пер-ключевой array с фильтром, флагами и параметрами — для детального управления сопоставьте ключ с array, который содержит filter, flags и options:

<?php
$data = ['age' => '150', 'tags' => ['php', 'mysql']];

$definition = [
    'age' => [
        'filter'  => FILTER_VALIDATE_INT,
        'options' => ['min_range' => 0, 'max_range' => 120],
    ],
    'tags' => [
        'filter' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
        'flags'  => FILTER_REQUIRE_ARRAY,
    ],
];

var_dump(filter_var_array($data, $definition));
array(2) {
  ["age"]=>
  bool(false)
  ["tags"]=>
  array(2) {
    [0]=>
    string(3) "php"
    [1]=>
    string(5) "mysql"
  }
}

age равно false, потому что 150 выходит за пределы диапазона 0–120, а FILTER_REQUIRE_ARRAY указывает фильтру обрабатывать tags как array и очищать каждый элемент.

Использование с данными формы

В реальном коде array $data обычно является суперглобальной переменной, такой как $_POST. Та же конфигурация, которую вы только что увидели, применяет правила и сохраняет очищенные значения в $result:

Пример PHP filter_var_array()

<?php

$filters = [
    'name'  => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
    'age'   => FILTER_VALIDATE_INT,
    'email' => FILTER_VALIDATE_EMAIL,
];

// $add_empty = false skips keys missing from $_POST instead of adding them as null
$result = filter_var_array($_POST, $filters, false);

if ($result === false || $result['email'] === false) {
    // Handle missing or invalid input
    echo 'Please correct the form.';
} else {
    // $result now holds clean, validated values
}

Обратите внимание, что неудачная проверка возвращает false для данного ключа, тогда как функция возвращает false целиком только в том случае, когда сам $data является недействительным. Всегда проверяйте оба случая. Для фильтрации $_POST или $_GET напрямую из входного потока смотрите тесно связанную функцию filter_input_array().

Примечание: FILTER_SANITIZE_STRING была удалена в PHP 8.0. Используйте вместо неё FILTER_SANITIZE_FULL_SPECIAL_CHARS.

Преимущества

Применение filter_var_array() повышает безопасность и надёжность вашего PHP-приложения за счёт обработки многих переменных в одном вызове. Валидация входных данных перед дальнейшей обработкой гарантирует, что приложение принимает только ожидаемые данные, снижая риск инъекций и ошибок, вызванных некорректными данными. Хранение правил в декларативном array $definition также отделяет валидацию от бизнес-логики, делая скрипты более модульными и удобными для сопровождения.

Заключение

filter_var_array() — это эффективный способ проверить и очистить целый набор переменных за один раз. Выберите форму определения фильтра, подходящую для ваших нужд: один фильтр для всех, карта по ключам или array параметров для каждого ключа — и всегда проверяйте false для каждого поля. Чтобы узнать больше, прочитайте главу Обзор фильтров PHP и главу Валидация форм PHP.

Практика

Практика
Какова цель функции 'filter_var_array()' в PHP?
Какова цель функции 'filter_var_array()' в PHP?
Was this page helpful?