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_* 常量之一。
警告

在用户对超全局变量进行任何修改之前,正在过滤的超全局变量内容是 SAPI 提供的“原始”内容。要过滤修改后的超全局变量,请使用 filter_var_array()

options
要么是选项的关联 array,要么是应用于每个条目的过滤器,可以是使用 FILTER_VALIDATE_* 常量的验证过滤器,也可以是使用 FILTER_SANITIZE_* 常量的清理过滤器。 选项数组是关联数组,其中 key 对应于数据 array 中的键,而关联的值要么是应用于该条目的过滤器,要么是描述如何以及应用哪个过滤器到该条目的关联数组。 描述如何应用过滤器的关联数组必须包含 'filter' key,其关联的值是要应用的过滤器,FILTER_VALIDATE_*FILTER_SANITIZE_*FILTER_UNSAFE_RAWFILTER_CALLBACK 常量之一。还可以选择性地包含 'flags' key,用于指定适用于过滤器的 flag,以及 'options' key,用于指定适用于过滤器的任何选项。
add_empty

为缺失的 key 添加 null 到返回值中。

返回值

成功时,返回 array,包含所请求变量的值。

失败时返回 false。有一个失败的例外情况,就是 type 指定的输入数组没有填充,并且使用了 FILTER_NULL_ON_FAILURE flag 时,返回 null

如果 add_emptytrue,则输入数组中缺失的条目会填充到返回数组中,并且缺失的条目将设置为 null

如果过滤失败,则返回 array 中的条目将为 false,当使用了 FILTER_NULL_ON_FAILURE flag 时为 null

注释

注意:

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

参见

添加备注

用户贡献的备注 9 notes

up
19
sdupuis at blax dot ca
11 years ago
Note that although you can provide a default filter for the entire input array there is no way to provide a flag for that filter without building the entire definition array yourself.So here is a small function that can alleviate this hassle!<?phpfunction 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);}?>
up
17
CertaiN
11 years ago
[New Version]This function is very useful for filtering complicated array structure.Also, Some integer bitmasks and invalid UTF-8 sequence detection are available.Code:<?php/** * @param  integer $type    Constant like INPUT_XXX. * @param  array   $default Default structure of the specified super global var. *                          Following bitmasks are available: *  + FILTER_STRUCT_FORCE_ARRAY - Force 1 dimensional array. *  + FILTER_STRUCT_TRIM        - Trim by ASCII control chars. *  + FILTER_STRUCT_FULL_TRIM   - Trim by ASCII control chars, *                                full-width and no-break space. * @return array            The value of the filtered super global var. */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;}?>
up
8
CertaiN
12 years ago
This function is very useful for filtering complicated array structure.Code:<?phpfunction 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;}?>Sample Usage:<?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',    ),)));?>Sample Result:array(2) {  ["a"]=>  string(21) "DEFAULT"  ["b"]=>  array(2) {    ["c"]=>    string(12) "CORRECT"    ["d"]=>    string(21) "DEFAULT"  }}
up
9
Anonymous
15 years ago
Beware: if none of the arguments is set, this function returns NULL, not an array of NULL values./* No POST vars set in request$_POST = array();*/$args = array('some_post_var' => FILTER_VALIDATE_INT);$myinputs = filter_input_array(INPUT_POST, $args);var_dump($myinputs);Expected Output: array(1) { ["some_post_var"]=> NULL } Actual Output: NULL
up
5
Kevin
17 years ago
Looks like filter_input_array isn't aware of changes to the input arrays that were made before calling filter_input_array. Instead, it always looks at the originally submitted input arrays.So this will not work:$_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);
up
5
CertaiN
11 years ago
[New Version]Example Usage:<?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,)));?>Example Result: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) ""  }}
up
3
ville at N0SPAM dot zydo dot com
15 years ago
While filtering input arrays, be careful of what flags you set besides FILTER_REQUIRE_ARRAY. For example, setting the flags like so:

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

.. will result in a blank $form_inputs['myInputArr'] regardless of what $_POST['myInputArr'] contains.
up
1
kibblewhite at live dot com
16 years ago
If you are trying to handling multiple form inputs with same name, then you must assign the `'flags'  => FILTER_REQUIRE_ARRAY` to the definitions entry.Example, you have a html form as such:<form> <input name="t1[]" value="Some string One" /> <input name="t1[]" value="Another String Two" /></form>Your definitions array will look a little like this:$args = array(  't1'    => array(      'name' => 't1',      'filter' => FILTER_SANITIZE_STRING,      'flags'  => FILTER_REQUIRE_ARRAY));
up
0
cornelyu85 at yahoo dot com
1 year ago
Here's an extended function that allows you to keep also the unfiltered items/args from the request, while you also apply validation to some of them:<?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