LoginSignup
20
22

More than 5 years have passed since last update.

filter_input_simple

Last updated at Posted at 2014-06-09

これは何?

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)
20
22
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
22