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

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

5
задан Rizier123 13 September 2016 в 14:17
поделиться

2 ответа

Такое поведение функции 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 равенства (== двойное равенство) и идентичности (=== тройное равенство)?

9
ответ дан 13 December 2019 в 19:23
поделиться

Вы правы, булево значение действительно может вызвать это. Установите флаг 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
2
ответ дан 13 December 2019 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: