Intereting Posts
PHP – как использовать $ timestamp для проверки, является ли сегодня понедельник или 1 месяц? Какой лучший способ определить язык? Есть ли разница в скорости между <? Php echo $ var; ?> и <? = $ var?>? Почтовая функция PHP не завершает отправку электронной почты Шаблон Data Mapper: сложный запрос из уровня сервиса Динамические теги <img> излишне перезагружают статические изображения как я могу получить идентификатор входа пользователя из mysql с помощью глобальной переменной в моем приложении для Android? Вопрос PHP DOMDocument: как заменить текст узла? Как получить подстроку между двумя строками в PHP? Ограничение левого соединения для возврата одного результата? Как я могу сделать кнопку отправки формы также перенаправлять на конкретный div на странице? Каков самый безопасный способ передачи аргументов с серверного PHP на клиентский JavaScript Параметры HTTP-сообщения передаются json, закодированные до $ _POST Как я могу предотвратить html-объекты с PHP DOMDocument :: saveHTML ()? Как я могу использовать кнопку сброса для php-формы?

Проблема с in_array

У меня недавно возникла странная проблема с in_array которую я не могу понять. например

 $a = array('a','b','c'); $b = array(1,2,3); if (in_array(0,$a)) { echo "a bingo!\n"; } else { echo "a miss!\n"; } if (in_array(0,$b)) { echo "b bingo!\n"; } else { echo "b miss!\n"; } 

Я запустил его на своей лампе и получил

 a bingo! b miss! 

Я прочитал руководство и установил третий параметр $strict как true , тогда он работал как ожидалось. Но означает ли это, что мне всегда нужно устанавливать строгий параметр как истинный при использовании in_array ? Предложения будут оценены.

С уважением

Solutions Collecting From Web of "Проблема с in_array"

Это означает, что вы должны установить третий параметр в true если хотите, чтобы сравнение не только сравнивало значения, но и типы .

Кроме того, при преобразовании типов есть преобразования типов, например, см. Преобразование строк в числа .

По сути, in_array без и со строгим – это то же самое отличие, что и между == и === – см. Операторы сравнения .

Это преобразование в большинстве случаев работает нормально … Но не в том случае, если вы пытаетесь сравнить 0 со строкой, которая начинается с буквы: строка преобразуется в числовое значение, которое имеет значение 0 в качестве значения.

Режим «default» in_array использует свободное сравнение, например, оператор сравнения == . Это означает, что 0 сравнивается следующим образом:

 var_dump(0 == 'a'); // bool(true) var_dump(0 == 'b'); // bool(true) var_dump(0 == 'c'); // bool(true) 

Теперь свободный оператор сравнения == использует преобразование строк в целое число до фактического сравнения значений:

Если вы сравниваете число со строкой или сравниваете числовые строки, то каждая строка преобразуется в число, а сравнение выполняется численно.

И 'a' , 'b' и 'c' преобразуются в 0 :

 var_dump((int) 'a'); // int(0) var_dump((int) 'b'); // int(0) var_dump((int) 'b'); // int(0) 

Но при использовании in_array в строгом режиме (установите третий параметр в true ) выполняется строгое сравнение ( === ) , это означает, что значение и тип должны быть равны:

 var_dump(0 === 'a'); // bool(false) var_dump(0 === 'b'); // bool(false) var_dump(0 === 'c'); // bool(false) 

Поэтому при использовании in_array в строгом режиме вы получаете ожидаемый результат:

 var_dump(in_array(0, $a, true)); // bool(false) 

В вашем первом примере каждое значение массива $ a, при преобразовании в числовое, равно 0. Вот почему ваш первый пример приводит к «бинго».

Вам не нужно использовать строгий параметр, если вы знаете, что полагаетесь на неявное преобразование или что ваши типы данных одинаковы (например, поиск строки в массиве строк). В противном случае вы должны использовать строгий параметр, то же самое вы должны использовать === вместо == при сравнении двух значений, которые должны быть одного типа.