filter_input_array

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

filter_input_array获取外部变量并可选地对其进行过滤

描述

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

此函数对于检索多个值非常有用,而无需重复调用 filter_input()

参数

type

INPUT_GETINPUT_POSTINPUT_COOKIEINPUT_SERVERINPUT_ENV 中的一个。

options

一个定义参数的数组。有效的键是一个包含变量名的 string,有效的 value 既可以是 过滤器类型,也可以是一个 array,可选地指定过滤器、标志和选项。如果 value 是一个数组,有效的键是 filter,它指定 过滤器类型flags 指定应用于过滤器的任何标志,以及 options 指定应用于过滤器的任何选项。请参阅下面的示例以更好地理解。

此参数也可以是一个整数,它保存一个 过滤器常量。然后输入数组中的所有值都将通过此过滤器进行过滤。

add_empty

将缺失的键作为 null 添加到返回值中。

返回值

如果成功,则返回一个包含请求变量值的数组。如果 type 指定的输入数组未填充,则如果未给出 FILTER_NULL_ON_FAILURE 标志,则函数返回 null,否则返回 false。对于其他失败,返回 false

如果过滤器失败,则数组值将为 false,或者如果变量未设置,则为 null。或者,如果使用了 FILTER_NULL_ON_FAILURE 标志,如果变量未设置,则返回 false,如果过滤器失败,则返回 null。如果 add_empty 参数为 false,则不会为未设置的变量添加任何数组元素。

示例

示例 #1 一个 filter_input_array() 示例

<?php

/* data actually came from POST
$_POST = array(
'product_id' => 'libgd<script>',
'component' => array('10'),
'version' => '2.0.33',
'testarray' => array('2', '23', '10', '12'),
'testscalar' => '2',
);
*/

$args = array(
'product_id' => FILTER_SANITIZE_ENCODED,
'component' => array('filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_REQUIRE_ARRAY,
'options' => array('min_range' => 1, 'max_range' => 10)
),
'version' => FILTER_SANITIZE_ENCODED,
'doesnotexist' => FILTER_VALIDATE_INT,
'testscalar' => array(
'filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_REQUIRE_SCALAR,
),
'testarray' => array(
'filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_REQUIRE_ARRAY,
)

);

$myinputs = filter_input_array(INPUT_POST, $args);

var_dump($myinputs);
echo
"\n";
?>

上面的示例将输出

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

注释

注意:

INPUT_SERVER 数组中没有 REQUEST_TIME 键,因为它是稍后插入到 $_SERVER 中的。

参见

添加注释

用户贡献的注释 9 notes

sdupuis at blax dot ca
10 年前
请注意,虽然您可以为整个输入数组提供默认过滤器,但无法为该过滤器提供标志,除非您自己构建整个定义数组。

因此,以下是一个可以减轻这种麻烦的小函数!

<?php
function filter_input_array_with_default_flags($type, $filter, $flags, $add_empty = true) {
$loopThrough = array();
switch (
$type) {
case
INPUT_GET : $loopThrough = $_GET; break;
case
INPUT_POST : $loopThrough = $_POST; break;
case
INPUT_COOKIE : $loopThrough = $_COOKIE; break;
case
INPUT_SERVER : $loopThrough = $_SERVER; break;
case
INPUT_ENV : $loopThrough = $_ENV; break;
}

$args = array();
foreach (
$loopThrough as $key=>$value) {
$args[$key] = array('filter'=>$filter, 'flags'=>$flags);
}

return
filter_input_array($type, $args, $add_empty);
}
?>
CertaiN
10 年前
[新版本]
此函数对于过滤复杂的数组结构非常有用。
此外,还提供了一些整数位掩码和无效 UTF-8 序列检测。

代码
<?php
/**
* @param integer $type 常量,例如 INPUT_XXX。
* @param array $default 指定的超级全局变量的默认结构。
* 以下位掩码可用:
* + FILTER_STRUCT_FORCE_ARRAY - 强制一维数组。
* + FILTER_STRUCT_TRIM - 按 ASCII 控制字符修剪。
* + FILTER_STRUCT_FULL_TRIM - 按 ASCII 控制字符修剪,
* 全角空格和不间断空格。
* @return array 过滤后的超级全局变量的值。
*/
define('FILTER_STRUCT_FORCE_ARRAY', 1);
define('FILTER_STRUCT_TRIM', 2);
define('FILTER_STRUCT_FULL_TRIM', 4);
function
filter_struct_utf8($type, array $default) {
static
$func = __FUNCTION__;
static
$trim = "[\\x0-\x20\x7f]";
static
$ftrim = "[\\x0-\x20\x7f\xc2\xa0\xe3\x80\x80]";
static
$recursive_static = false;
if (!
$recursive = $recursive_static) {
$types = array(
INPUT_GET => $_GET,
INPUT_POST => $_POST,
INPUT_COOKIE => $_COOKIE,
INPUT_REQUEST => $_REQUEST,
);
if (!isset(
$types[(int)$type])) {
throw new
LogicException('unknown super global var type');
}
$var = $types[(int)$type];
$recursive_static = true;
} else {
$var = $type;
}
$ret = array();
foreach (
$default as $key => $value) {
if (
$is_int = is_int($value)) {
if (!(
$value | (
FILTER_STRUCT_FORCE_ARRAY |
FILTER_STRUCT_FULL_TRIM |
FILTER_STRUCT_TRIM
))) {
$recursive_static = false;
throw new
LogicException('unknown bitmask');
}
if (
$value & FILTER_STRUCT_FORCE_ARRAY) {
$tmp = array();
if (isset(
$var[$key])) {
foreach ((array)
$var[$key] as $k => $v) {
if (!
preg_match('//u', $k)){
continue;
}
$value &= FILTER_STRUCT_FULL_TRIM | FILTER_STRUCT_TRIM;
$tmp += array($k => $value ? $value : '');
}
}
$value = $tmp;
}
}
if (
$isset = isset($var[$key]) and is_array($value)) {
$ret[$key] = $func($var[$key], $value);
} elseif (!
$isset || is_array($var[$key])) {
$ret[$key] = null;
} elseif (
$is_int && $value & FILTER_STRUCT_FULL_TRIM) {
$ret[$key] = preg_replace("/\A{$ftrim}++|{$ftrim}++\z/u", '', $var[$key]);
} elseif (
$is_int && $value & FILTER_STRUCT_TRIM) {
$ret[$key] = preg_replace("/\A{$trim}++|{$trim}++\z/u", '', $var[$key]);
} else {
$ret[$key] = preg_replace('//u', '', $var[$key]);
}
if (
$ret[$key] === null) {
$ret[$key] = $is_int ? '' : $value;
}
}
if (!
$recursive) {
$recursive_static = false;
}
return
$ret;
}
?>
CertaiN
11 年前
此函数对于过滤复杂的数组结构非常有用。

代码
<?php
function filter_request($var, $default_structure) {

$ret = array();

foreach (
$default_structure as $key => $value) {
if (!isset(
$var[$key])) {
$ret[$key] = $value;
} elseif (
is_array($value)) {
$ret[$key] = filter_request($var[$key], $value);
} elseif (
is_array($var[$key])) {
$ret[$key] = $value;
} else {
$ret[$key] = $var[$key];
}
}

return
$ret;

}
?>

示例用法
<?php
$_GET
['a']['wrong_structure'] = 'foo';
$_GET['b']['c'] = 'CORRECT';
$_GET['b']['d']['wrong_structure'] = 'bar';
$_GET['unneeded_item'] = 'baz';

var_dump(filter_request($_GET, array(
'a' => 'DEFAULT',
'b' => array(
'c' => 'DEFAULT',
'd' => 'DEFAULT',
),
)));
?>

示例结果
array(2) {
["a"]=>
string(21) "DEFAULT"
["b"]=>
array(2) {
["c"]=>
string(12) "CORRECT"
["d"]=>
string(21) "DEFAULT"
}
}
匿名
14 年前
注意:如果没有任何参数设置,此函数将返回 NULL,而不是一个包含 NULL 值的数组。

/* 请求中没有设置 POST 变量
$_POST = array();
*/

$args = array('some_post_var' => FILTER_VALIDATE_INT);
$myinputs = filter_input_array(INPUT_POST, $args);
var_dump($myinputs);

预期输出:array(1) { ["some_post_var"]=> NULL }

实际输出:NULL
Kevin
16 年前
看起来 filter_input_array 不知道在调用 filter_input_array 之前对输入数组所做的更改。相反,它始终查看最初提交的输入数组。

所以这样不可行

$_POST['my_float_field'] = str_replace(',','.',$_POST['my_float_field']);
$args = array('my_float_field',FILTER_VALIDATE_FLOAT);
$result = filter_input_array(INPUT_POST, $args);
CertaiN
10 年前
[新版本]

示例用法
<?php
$_GET
['A']['a'] = ' CORRECT(including some spaces) ';
$_GET['A']['b'] = ' CORRECT(including some spaces) ';
$_GET['A']['c'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['A']['d']['invalid_structure'] = 'INVALID';

$_GET['B']['a'] = ' CORRECT(including some spaces) ';
$_GET['B']['b'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['B']['c']['invalid_structure'] = 'INVALID';
$_GET['B']["Invalid UTF-8 sequence: \xe3\xe3\xe3"] = 'INVALID';

$_GET['C']['a'] = ' CORRECT(including some spaces) ';
$_GET['C']['b'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['C']['c']['invalid_structure'] = 'INVALID';
$_GET['C']["Invalid UTF-8 sequence: \xe3\xe3\xe3"] = 'INVALID';

$_GET['unneeded_item'] = 'UNNEEDED';

var_dump(filter_struct_utf8(INPUT_GET, array(
'A' => array(
'a' => '',
'b' => FILTER_STRUCT_TRIM,
'c' => '',
'd' => '',
),
'B' => FILTER_STRUCT_FORCE_ARRAY,
'C' => FILTER_STRUCT_FORCE_ARRAY | FILTER_STRUCT_TRIM,
)));
?>

示例结果
array(3) {
["A"]=>
array(4) {
["a"]=>
string(36) " CORRECT(including some spaces) "
["b"]=>
string(30) "CORRECT(including some spaces)"
["c"]=>
string(0) ""
["d"]=>
string(0) ""
}
["B"]=>
array(3) {
["a"]=>
string(36) " CORRECT(including some spaces) "
["b"]=>
string(0) ""
["c"]=>
string(0) ""
}
["C"]=>
array(3) {
["a"]=>
string(30) "CORRECT(including some spaces)"
["b"]=>
string(0) ""
["c"]=>
string(0) ""
}
}
ville at N0SPAM dot zydo dot com
14 年前
在过滤输入数组时,请注意除了 FILTER_REQUIRE_ARRAY 之外设置的标志。例如,像这样设置标志

<?php
$filter
= array(
'myInputArr' => array('filter' => FILTER_SANITIZE_STRING,
'flags' => array('FILTER_FLAG_STRIP_LOW', 'FILTER_REQUIRE_ARRAY'))
);

$form_inputs = filter_input_array(INPUT_POST, $filter);
?>

..将导致 $form_inputs['myInputArr'] 为空,无论 $_POST['myInputArr'] 包含什么。
kibblewhite at live dot com
15 年前
如果您尝试处理具有相同名称的多个表单输入,则必须将 `'flags' => FILTER_REQUIRE_ARRAY` 分配给定义条目。

例如,您有一个这样的 HTML 表单
<form>
<input name="t1[]" value="Some string One" />
<input name="t1[]" value="Another String Two" />
</form>

您的定义数组将如下所示
$args = array(
't1' => array(
'name' => 't1',
'filter' => FILTER_SANITIZE_STRING,
'flags' => FILTER_REQUIRE_ARRAY)
);
cornelyu85 at yahoo dot com
11 个月前
这是一个扩展函数,它允许您保留来自请求的未过滤的项目/参数,同时您也可以对其中一些项目应用验证。

<?php

$validationRules
= [
'foo' => [
'filter' => FILTER_VALIDATE_REGEXP,
'options' => ['regexp' => '/^(bar|baz)$/i']
]
];

$request = filter_input_array_keep_unfiltered_args(INPUT_POST, $validationRules);

var_dump($request);

function
filter_input_array_keep_unfiltered_args($type, $filters, $addEmpty = true)
{
$rawRequest = filter_input_array($type);

$validationRules = [];
foreach (
$rawRequest as $key => $value) {
$validationRules[$key] = isset($filters[$key]) ? $filters[$key] : ['filter' => FILTER_DEFAULT];
}

return
filter_input_array($type, $validationRules, $addEmpty);
}

?>
To Top