Filter var array: примеры (PHP)

Фильтрация массивов данных с помощью filter_var_array
Раздел: Фильтрация данных
filter_var_array(array $array, array|int $options = FILTER_DEFAULT, bool $add_empty = true): array|false|null
Функция filter_var_array в PHP

Функция filter_var_array предоставляет возможность фильтрации нескольких переменных с использованием одинаковых или различных правил. Применяется при необходимости валидации или санитизации массива данных, например, полученных из формы или внешнего источника.

Аргументы функции

Первый аргумент (array $data): массив данных для обработки. Ключи массива соответствуют именам переменных.

Второй аргумент (array|int $options): может быть массивом, определяющим правила фильтрации для каждого элемента, или целым числом (ID фильтра), применяемым ко всем элементам. В массиве каждый ключ соответствует ключу в $data, а значение может быть либо ID фильтра, либо массивом с параметрами: 'filter', 'flags', 'options'.

Третий аргумент (bool $add_empty = true): определяет, добавлять ли в результат элементы с ключами из $options, отсутствующие в $data, со значением NULL. Если false, такие ключи исключаются из результата.

Функция возвращает массив с отфильтрованными значениями или false при ошибке.

Простые примеры использования
Применение одного фильтра ко всем элементам
$data = ['age' => '25', 'score' => '100.5'];
$result = filter_var_array($data, FILTER_VALIDATE_INT);
print_r($result);
Array
(
    [age] => 25
    [score] => false
)
Разные фильтры для каждого элемента
$data = ['email' => 'user@example.com', 'number' => '42'];
$options = [
    'email' => FILTER_VALIDATE_EMAIL,
    'number' => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 100]]
];
$result = filter_var_array($data, $options);
print_r($result);
Array
(
    [email] => user@example.com
    [number] => 42
)
Использование флагов
$data = ['ip' => '192.168.1.1', 'url' => 'https://example.com?q=test'];
$options = [
    'ip' => FILTER_VALIDATE_IP,
    'url' => ['filter' => FILTER_VALIDATE_URL, 'flags' => FILTER_FLAG_QUERY_REQUIRED]
];
$result = filter_var_array($data, $options);
print_r($result);
Array
(
    [ip] => 192.168.1.1
    [url] => https://example.com?q=test
)
Аналогичные функции в PHP

filter_var: обрабатывает одну переменную. Используется, когда нужно проверить одно значение.

filter_input_array: получает и фильтрует массив внешних переменных (GET, POST, COOKIE и т.д.). Удобна для работы с суперглобальными массивами.

array_map с filter_var: позволяет применить filter_var к каждому элементу массива, но без гибкости разных правил для разных ключей.

Ручная валидация: использование регулярных выражений или других функций (ctype_*, is_*). Дает полный контроль, но требует больше кода.

Аналоги в других языках
Python: модуль validators
import validators
email_valid = validators.email('user@example.com')
print(email_valid)
True

В Python нет встроенной функции, полностью аналогичной filter_var_array, но можно использовать комбинации словарей и функций валидации.

JavaScript: библиотека validator
const validator = require('validator');
let results = {
    email: validator.isEmail('user@example.com'),
    int: validator.isInt('25')
};
console.log(results);
{ email: true, int: true }

В JavaScript также отсутствует прямая аналогия, но библиотеки предоставляют схожие возможности.

MySQL: функции валидации
SELECT 
    VALIDATE_PASSWORD_STRENGTH('password') AS password_strength,
    CAST('42' AS UNSIGNED) AS casted_int;

MySQL предлагает функции для проверки данных, но они встроены в SQL-запросы и не являются прямым аналогом.

Распространенные ошибки
Неверная структура options
$data = ['age' => '25'];
$options = FILTER_VALIDATE_INT; // Должен быть массив для одного элемента
$result = filter_var_array($data, $options);
var_dump($result);
bool(false)
Отсутствие обработки false
$data = ['num' => 'not_number'];
$result = filter_var_array($data, FILTER_VALIDATE_INT);
if ($result['num']) { // false интерпретируется как false
    echo 'Valid';
} else {
    echo 'Invalid';
}
Invalid
Путаница между FILTER_VALIDATE и FILTER_SANITIZE
$data = ['html' => '<script>alert(1)</script>'];
$result = filter_var_array($data, FILTER_VALIDATE_STRING); // Несуществующий фильтр
var_dump($result);
NULL
Изменения в последних версиях PHP

В PHP 8.0 поведение функции filter var array было изменено: теперь при неверном ID фильтра выбрасывается исключение ValueError. Ранее возвращалось false или null.

// PHP 8+
try {
    $result = filter_var_array(['test' => 'value'], ['test' => 9999]);
} catch (ValueError $e) {
    echo $e->getMessage();
}
filter_var_array(): Argument #2 ($options) must be a valid filter ID

В PHP 8.1 добавлена поддержка FILTER_NULL_ON_FAILURE для фильтров валидации.

Расширенные примеры
Комбинирование флагов
Пример php
$data = [
    'ip' => '2001:0db8:85a3:0000:0000:8a2e:0370:7334',
    'url' => 'https://example.com:8080/path'
];
$options = [
    'ip' => ['filter' => FILTER_VALIDATE_IP, 'flags' => FILTER_FLAG_IPV6],
    'url' => ['filter' => FILTER_VALIDATE_URL, 'flags' => FILTER_FLAG_PATH_REQUIRED | FILTER_FLAG_SCHEME_REQUIRED]
];
$result = filter_var_array($data, $options);
print_r($result);
Array
(
    [ip] => 2001:0db8:85a3:0000:0000:8a2e:0370:7334
    [url] => https://example.com:8080/path
)
С кастомным фильтром
Пример php
filter_var($data, FILTER_CALLBACK, ['options' => function($v) { 
    return is_numeric($v) ? $v * 2 : false; 
}]);
$data = ['a' => '5', 'b' => 'text'];
$options = [
    'a' => ['filter' => FILTER_CALLBACK, 'options' => 'double'],
    'b' => FILTER_UNSAFE_RAW
];
function double($v) { return is_numeric($v) ? $v * 2 : $v; }
$result = filter_var_array($data, $options);
print_r($result);
Array
(
    [a] => 10
    [b] => text
)
Валидация вложенных массивов
Пример php
$data = ['user' => ['email' => 'test@example.com', 'age' => '30']];
$options = ['user' => ['filter' => FILTER_DEFAULT, 'flags' => FILTER_REQUIRE_ARRAY]];
$result = filter_var_array($data, $options);
print_r($result);
Array
(
    [user] => Array
        (
            [email] => test@example.com
            [age] => 30
        )
)

PHP filter_var_array function comments

En
Filter var array Gets multiple variables and optionally filters them