これは何?
filter_input 関数の惜しいところを使いやすく、安全にした強化版です。
ネストした配列をクエリストリングのまま扱います。
filter_input_array_recursive 関数との比較
filter_input_array_recursive | filter_input_simple | |
---|---|---|
パフォーマンス(初回コール時) | ○ | △ |
パフォーマンス(2回目以降) | ○ | ◎ |
ネストした配列への対応 | ◎ | ◎ |
ネストした任意の配列への対応 | ◎ | × |
関数の定義
<?php
/**
* Differently from filter_input(), this treats nested array as string.
* Not...
* $_POST['foo']['bar']['baz'] = 'value';
* But...
* $_POST['foo[bar][baz]'] = 'value';
*
* @param int $type same as filter_input().
* @param array $name same as filter_input().
* @param int $filter same as filter_input().
* @param mixed $options same as filter_input().
* @return mixed same as filter_input().
*/
function filter_input_simple($type, $name, $filter = FILTER_DEFAULT, $options = FILTER_REQUIRE_SCALAR) {
static $vars;
if (!$vars) {
$vars = array(
INPUT_GET => filter_input(INPUT_SERVER, 'QUERY_STRING'),
INPUT_POST => file_get_contents('php://input'),
INPUT_COOKIE => filter_input(INPUT_SERVER, 'HTTP_COOKIE'),
);
$s = array('&', '&', ';[; ]++');
foreach ($vars as $t => $var) {
$tmp = array();
foreach (preg_split("@{$s[$t]}@", $var, -1, PREG_SPLIT_NO_EMPTY) as $i) {
list($k, $v) = explode('=', $i, 2) + array(1 => '');
$tmp[urldecode($k)] = urldecode($v);
}
unset($tmp['']);
$var[$t] = $tmp;
}
$vars[INPUT_REQUEST] = $vars[INPUT_COOKIE] + $vars[INPUT_POST] + $vars[INPUT_GET];
}
$type = (int)$type;
$name = filter_var($name);
if (!isset($vars[$type][$name])) {
return null;
}
return filter_var($vars[$type][$name], $filter, $options);
}
使い方
foo[bar][a]=str&foo[bar][b][c]=strのとき
var_dump(
filter_input_simple(INPUT_GET, 'foo[bar][a]'), // string(3) "str"
filter_input_simple(INPUT_GET, 'foo[bar][b]') // null
);
foo[bar][validated_float]=1,234.213のとき
var_dump(
filter_input_simple(
INPUT_GET,
'foo[bar][validated_float]',
FILTER_VALIDATE_FLOAT,
array(
'options' => array(
'min_range' => 1234,
'max_range' => 1235,
),
'flags' => FILTER_FLAG_ALLOW_THOUSAND,
)
)
); // float(1234.213)