Я пытаюсь проверить, если filter_var_array
отфильтровал некоторые входные данные.
Согласно PHP документу filter_var_array
вернуть false
если фильтр не работает или null
если переменная не установлена.
Я создал небольшой тест, чтобы проверить, как искать (null, false)
внутри массивов, и я получил некоторые странные результаты
$tmp = $tmp = array(null, 1, 'test', 100, false);
$arr = array(null, false);
$x = in_array(array_map('strtolower',$arr), array_map('strtolower', $tmp), true);
var_dump($x);
$x = in_array(array_map('strtolower', $tmp), array_map('strtolower',$arr), true);
var_dump($x);
выход:
boolean false
boolean false
Я делаю что-то неправильно?
РЕДАКТИРОВАТЬ:
Ответ дается в комментарии @sg.
Способ сделать это с помощью array_intersect
,
$tmp = array(null, 1, 0, FALSE, 'test', NULL, 100, false);
$arr = array(null, false);
$x = array_intersect($tmp, $arr);
var_dump($x);
выход:
array (size=4)
0 => null
3 => boolean false
5 => null
7 => boolean false
важные заметки:
1. Если $ needle — это массив. in_array
поиск совпадения с полным массивом
2. array_intersect
строгий тип
Я делаю что-то неправильно?
Да:
Вы рассматриваете null и false как строки, передавая их strtolower. Это не очень хорошая идея.
in_array не работает так. На данный момент вы просите его найти массив, содержащий null и false внутри первого массива. Он не перебирает все значения в игле, ища каждое из них в отдельности. Попробуйте это, чтобы увидеть:
$tmp = array(array(null, false), 1, 'test', 100, false);
$arr = array(null, false);
$x = in_array($arr, $tmp, true);
var_dump($x);
$x = in_array($tmp, $arr, true);
var_dump($x);
Ваше утверждение о возвращаемых значениях in_array неверно. in_array «Возвращает TRUE, если в массиве найдена игла, иначе FALSE.»
Других решений пока нет …