在 PHP 中,数据过滤和验证是处理用户输入时不可或缺的一部分。我们经常会用 filter_var() 来验证单个数据值,但如果我们有一组数据,比如表单提交的多项字段,每个字段都需要不同的验证规则,这时使用 filter_var_array() 就非常合适。
filter_var_array() 是 PHP 提供的一个函数,用于过滤多个数据值,通常是一个关联数组,比如来自 $_GET 或 $_POST 的数据。这个函数可以根据你定义的过滤器规则,对每个字段分别进行处理。
函数原型如下:
filter_var_array(array $data, array|int $definition, bool $add_empty = true): array|false|null
$data:要处理的数组数据。
$definition:过滤规则,可以是一个整型(为所有字段使用同一个过滤器),也可以是一个数组(为不同字段定义不同过滤器)。
$add_empty:是否在结果中包含没有匹配到的键,默认为 true。
假设你有一个用户登录表单,包含邮箱和年龄字段。你希望对邮箱进行验证,对年龄进行整数验证并限制范围。使用 filter_var_array() 处理如下:
$data = [
'email' => '[email protected]',
'age' => '25'
];
$filters = [
'email' => FILTER_VALIDATE_EMAIL,
'age' => [
'filter' => FILTER_VALIDATE_INT,
'options' => [
'min_range' => 18,
'max_range' => 99
]
]
];
$result = filter_var_array($data, $filters);
print_r($result);
输出可能是:
Array
(
[email] => [email protected]
[age] => 25
)
如果验证失败,相应的值会变成 false。
filter_var_array() 特别适合处理表单数据,因为你可以定义清晰的验证规则并批量处理。
$_POST = [
'username' => 'jack',
'email' => '[email protected]',
'age' => '17'
];
$rules = [
'username' => [
'filter' => FILTER_SANITIZE_STRING,
'flags' => FILTER_FLAG_NO_ENCODE_QUOTES
],
'email' => FILTER_VALIDATE_EMAIL,
'age' => [
'filter' => FILTER_VALIDATE_INT,
'options' => ['min_range' => 18]
]
];
$cleanData = filter_var_array($_POST, $rules);
print_r($cleanData);
在这个例子中,如果年龄小于 18,返回的 age 就会是 false,提示我们验证失败。
你可以通过 FILTER_DEFAULT 和自定义选项来设置默认值,在缺少字段时也能得到有意义的输出。
$data = [
'email' => 'wrong-format',
// 'age' => missing
];
$rules = [
'email' => FILTER_VALIDATE_EMAIL,
'age' => [
'filter' => FILTER_VALIDATE_INT,
'options' => ['default' => 18]
]
];
$result = filter_var_array($data, $rules);
print_r($result);
输出:
Array
(
[email] => false
[age] => 18
)
当你接收第三方 API 提交的数据时,使用 filter_var_array() 可以快速确保数据安全。
$json = file_get_contents('https://api.gitbox.net/user/input');
$input = json_decode($json, true);
$filters = [
'email' => FILTER_VALIDATE_EMAIL,
'subscription' => FILTER_VALIDATE_BOOLEAN
];
$validated = filter_var_array($input, $filters);
如果传入的 $data 不是数组,filter_var_array() 会返回 false。
如果某些键不在 $definition 中,但 $add_empty 设置为 true,它们仍会出现在返回结果中,值为 null。
需要小心使用 FILTER_SANITIZE_* 类型的过滤器,它们是清洗数据而不是验证数据。
filter_var_array() 是一个非常强大的工具,能够帮助我们对一组数据进行批量验证与清洗,代码更加简洁,也更具可维护性。在处理表单数据、API 请求或者任何需要多字段验证的场景中,它都能大放异彩。
学会合理使用 filter_var_array(),你将能大幅提高 PHP 项目中数据处理的安全性与效率。