PHP in_array () / array_search () странное поведение - PullRequest
5 голосов
/ 29 апреля 2010

Я обнаружил странное поведение, когда использовал функцию PHP in_array(). У меня есть такой массив:

$arr = [TRUE, "some string", "something else"];

Теперь, если я хочу проверить, находится ли "test" в массиве, его явно нет, но in_array() все еще возвращает TRUE, почему это так?

$result = in_array("test", $arr);
var_dump($result);  //<b>Output: bool(true)</b>

То же самое происходит при использовании array_search():

$result = array_search("test", $arr);
var_dump($result);  //<b>Output: int(0)</b>

Возможно, я подумал, что значение TRUE в массиве автоматически заставляло функцию возвращать TRUE для каждого результата без проверки остальной части массива, но я не смог найти никакой документации, которая бы предлагала эту очень странную функциональность. *

Ответы [ 2 ]

9 голосов
/ 29 апреля 2010

Такое поведение функции in_array() и array_search() не ошибка, а хорошо документированное поведение.

Обе функции имеют третий необязательный параметр с именем $strict, который по умолчанию равен FALSE:

bool in_array (смешанный $ needle, массив $ haystack [, bool $ strict = FALSE] )

mixed array_search (mixed $ needle, array $ haystack [, bool $ strict = false] )

Теперь это означает, что по умолчанию обе функции используют произвольное (==) сравнение для сравнения значений. Таким образом, они проверяют, совпадают ли значения после PHP-манипулирования и без проверки типа. Из-за этого в вашем примере TRUE == "any none emtpy string" оценивается как ИСТИНА.

Таким образом, устанавливая для третьего параметра значение TRUE при вызове функции, вы говорите, что PHP должен использовать строгое (===) сравнение и проверять значение И тип значений при сравнении.

См. Это как ссылку: Чем отличаются операторы сравнения PHP (== double equals) и тождества (=== triple equals)?

2 голосов
/ 29 апреля 2010

Вы правы, логическое значение действительно может вызвать это. Установите флаг strict в функции in_array, таким образом проверяется также тип элемента *1005* (в основном аналогично использованию ===):

if (in_array("username", $results, true)) // do something
if (in_array("password", $results, true)) // do something
if (in_array("birthday", $results, true)) // do something
...