Фильтрация входных данных PHP для сложных массивов
официальная документация 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 ответов
Идея 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
);
затем вы можете создать массив ссылок, которые сопоставляют ключи, такие как "пользователь/возраст", с $data ["пользователь"] ["возраст"]. В окончательном производстве вы получаете что-то вроде этого:
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));
теперь единственный вопрос заключается в том, как вы справляетесь с несоответствием между записью проверки и исходным набором данных. Это я не могу ответить не зная, как их использовать.