Intereting Posts
php изменение размера изображения при загрузке Использование цикла foreach для удаления всех данных класса из источника страницы Выделение массива с числовыми ключами в качестве объекта Неустранимая ошибка: имя функции должно быть строкой в ​​/home/User/public_html/website/index.php в строке 7 PHPmailer отправляет почту спама в hotmail. как исправить? Как динамически вызывать функцию php в javascript Переменная не существует в symfony2 PHP: Как определить, содержит ли строка какие-либо специальные символы? Как получить данные по $ _GET на php, когда я использовал .htaccess Обслуживание загрузки с помощью PHP и cURL Как настроить переписывание URL-адресов для поддоменных ссылок, подобных этим? Резервное копирование и восстановление базы данных MySQL в PHP PHP $ _POST и только идентификатор, нет имени Простой сценарий ajax для отображения имени книги Максимальное время выполнения PHP

Вводная фильтрация 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')) ); 

Solutions Collecting From Web of "Вводная фильтрация PHP для сложных массивов"

Идея 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)); 

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