В официальной документации 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
Рассмотрите возможность использования 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 ['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));
Теперь остается только вопрос о том, как вы справляетесь с несоответствием между записью проверки и исходным набором данных. Это я не могу ответить, не зная, как вам нужно их использовать.