PHP входная фильтрация для сложных массивов - PullRequest
7 голосов
/ 14 февраля 2011

Официальная документация PHP гласит, что filter_var_array() поддерживает фильтрацию массивов в следующем формате:

$data = array(
    'testarray'    => array('2', '23', '10', '12')
);

$args = array(
    'testarray'    => array('filter'    => FILTER_VALIDATE_INT,
                            'flags'     => FILTER_FORCE_ARRAY
                           )    
);

$myinputs = filter_var_array($data, $args);

Однако, если рассматриваемый массив является многомерным и требует разных фильтров для разных деталей, как бы вы подошли к определению параметров фильтрации?

Как пример:

$data = array(
    'testhash'    => array('level1'=>'email', 
                           'level2'=> array('23', '10', '12'))
);

1 Ответ

11 голосов
/ 14 февраля 2011

Идея 1

Рассмотрите возможность использования FILTER_CALLBACK. Таким образом, вы можете написать функцию обратного вызова, которая сама использует расширение фильтра, обеспечивая рекурсивную возможность.

function validate_array($args) {
    return function ($data) use ($args) {
        return filter_input_array($data, $args);
    };
}

Это сгенерирует функции обратного вызова.

$args = array(
    'user' => array(
        'filter' => FILTER_CALLBACK,
        'options' => validate_array(array(
            'age' => array('filter' => FILTER_INPUT_INT),
            'email' => array('filter' => FILTER_INPUT_EMAIL)
        ))
    )
);

Вот так будет выглядеть массив конфигурации.

Идея 2

Не стесняйтесь похлопать меня по спине за этот, потому что я очень горжусь этим.

Возьмите массив arg, который выглядит следующим образом. Трещины указывают на глубину.

$args = array(
    'user/age' => array('filter' => FILTER_INPUT_INT),
    'user/email' => array('filter' => FILTER_INPUT_EMAIL),
    'user/parent/age' => array('filter' => FILTER_INPUT_INT),
    'foo' => array('filter' => FILTER_INPUT_INT)
);

Предположим, ваши данные выглядят примерно так.

$data = array(
    'user' => array(
        'age' => 15,
        'email' => 'foo@gmail.com',
        'parent' => array(
            'age' => 38
        )
    ),
    'foo' => 5
);

Затем вы можете сгенерировать массив ссылок, которые сопоставляют ключи, такие как 'user / age', с $ data ['user'] ['age']. В конечном производстве вы получите что-то вроде этого:

function my_filter_array($data, $args) {
    $ref_map = array();
    foreach ($args as $key => $a) {
        $parts = explode('/', $key);
        $ref =& $data;
        foreach ($parts as $p) $ref =& $ref[$p];
        $ref_map[$key] =& $ref;
    }
    return filter_var_array($ref_map, $args);
}

var_dump(my_filter_array($data, $args));

Теперь единственный вопрос - как вы справляетесь с несоответствием между проверочной записью и исходным набором данных. На это я не могу ответить, не зная, как их использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...