Я обнаружил некоторое нечетное поведение, когда я использовал функцию PHP in_array() . У меня такой массив:
$arr = [TRUE, "some string", "something else"];
Теперь, если я хочу проверить, есть ли "test" в массиве, это явно не так, но in_array() прежнему возвращает TRUE, почему?
$result = in_array("test", $arr); var_dump($result); // Output: bool(true)
То же самое происходит при использовании array_search() :
$result = array_search("test", $arr); var_dump($result); // Output: int(0)
Я подумал, что возможно, что значение TRUE в массиве автоматически заставляло функцию возвращать TRUE для каждого результата без проверки остальной части массива, но я не мог найти никакой документации, которая могла бы предложить эту очень необычную функциональность.
Такое поведение функции in_array() и array_search() не является ошибкой, а скорее хорошо документированным поведением.
Обе функции имеют третий необязательный параметр с именем $strict который по умолчанию FALSE:
bool in_array (смешанная $ игла, массив $ haystack [, bool $ strict = FALSE] )
mixed array_search (смешанная $ игла, массив $ haystack [, bool $ strict = false] )
Теперь это означает, что по умолчанию обе функции используют слабое ( == ) сравнение для сравнения значений. Поэтому они проверяют, совпадают ли значения после манипуляции с PHP-типами и без проверки типа. Из-за этого в вашем примере TRUE == "any none emtpy string" значение TRUE.
Поэтому, установив третий параметр в TRUE при вызове функции, вы говорите, что PHP должен использовать строгое ( === ) сравнение, и он должен проверять значение И тип значений во время сравнения.
См. Это как ссылку: как различаются операторы сравнения равенствам (== double equals) и идентичности (=== triple equals)?
Вы правы, логическое может действительно вызвать это. Установите strict флаг в функции in_array , таким образом проверяется также тип элемента (в основном это аналогично использованию === ):
if (in_array("username", $results, true)) // do something if (in_array("password", $results, true)) // do something if (in_array("birthday", $results, true)) // do something