PHP in_array () / array_search () нечетное поведение

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