Я обнаружил некоторое нечетное поведение, когда я использовал функцию 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