Я нашел некоторое нечетное поведение, в то время как я использовал функцию PHP in_array()
. У меня есть массив как это:
$arr = [TRUE, "some string", "something else"];
Теперь, если я хочу проверить если "test"
находится в массиве, который это ясно не, но in_array()
все еще возвраты ПРАВДА, почему это?
$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 ()
не является ошибкой, а скорее хорошо задокументированное поведение.
Обе функции имеют 3-й необязательный параметр, называемый $ strict
, который по умолчанию равен FALSE:
bool in_array (mixed $ Need, array $ haystack [, bool $ strict = FALSE] )
смешанный array_search (смешанный $ игла, массив $ haystack [, bool $ strict = false] )
Это означает, что по умолчанию обе функции используют свободно ( ==
) сравнение для сравнения значений. Таким образом, они проверяют, совпадают ли значения только после манипуляции типами PHP и без проверки типа. Из-за этого в вашем примере TRUE == "any none emtpy string"
оценивается как TRUE.
Таким образом, устанавливая для 3-го параметра значение ИСТИНА при вызове функции, вы говорите, что PHP должен использовать строгое ( ===
) сравнение, и он должен проверять значение И тип значений при сравнении.
См. Это как ссылку: Чем отличаются операторы сравнения PHP равенства (== двойное равенство) и идентичности (=== тройное равенство)?
Вы правы, булево значение действительно может вызвать это. Установите флаг 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