Подтвердить что ты не робот

Php, in_array, значение 0

Я пытался понять поведение in_array в следующем сценарии:

$arr = array(2 => 'Bye', 52, 77, 3 => 'Hey');
var_dump(in_array(0, $arr));

Возвращаемое значение in_array() имеет значение boolean true. Как вы можете видеть, значение нет равно 0, поэтому, если кто-нибудь, пожалуйста, помогите мне понять, почему функция возвращает true?

4b9b3361

Ответ 1

Это известная проблема в комментариях в документации. Рассмотрим следующие примеры:

in_array(0, array(42));      // FALSE
in_array(0, array('42'));    // FALSE
in_array(0, array('Foo'));   // TRUE

Чтобы избежать этого, предоставьте третий параметр true, поставив сравнение в строгом режиме, который будет не только сравнивать значения, но и типы:

var_dump(in_array(0, $arr, true));

Существуют другие условия работы, которые не требуют, чтобы каждая проверка была помещена в строгом режиме:

in_array($value, $my_array, empty($value) && $value !== '0');

Но почему?

Причиной всего этого является, скорее всего, преобразование строк в число. Если мы попытаемся получить число из "Bye", нам дается 0, это значение, которое мы запрашиваем для поиска.

echo intval("Bye"); // 0

Чтобы подтвердить это, мы можем использовать array_search, чтобы найти ключ, связанный с соответствующим значением:

$arr = array(2 => 'Bye', 52, 77, 3 => 'Hey');
echo array_search(0, $arr);

В этом возвращенном ключе 2, что означает, что 0 находится в преобразовании Bye в целое число.

Ответ 2

Попробуйте добавить третий параметр true (строгий режим) к вызову in_array.

Ответ 3

Это результат свободного сравнения и типа жонглирования.

Свободное сравнение означает, что PHP использует == not === при сравнении элементов. == не сравнивает, что два типа переменных равны, только их значение, а === гарантирует, что они соответствуют типу и значению (например, сравните 0 == FALSE и 0 === FALSE).

Итак, в основном, ваша функция in_array проверяет:

0 == 'Bye'
0 == 'Hey'
0 == 77

Обратите внимание, что 52 будет потерян из-за того, как вы создали свой массив.

Итак, обратите внимание, что если вы выполните:

print (0 == 'Bye');

Вы получите 1. Видимо, PHP тип жонглирования "Bye" равен 0, что то же самое, что произойдет, когда вы лить строку в int, например (int) 'string' будет равным 0. Специфическая ссылка из преобразование строки в число doc (добавлено выделение):

Значение задается начальной частью строки. Если строка начинается с действительных числовых данных, это будет используемое значение. В противном случае значение будет 0 (ноль). Действительные числовые данные являются необязательный знак, за которым следует одна или несколько цифр (необязательно содержащий десятичная точка), а затем необязательный показатель. Показатель - это 'e' или 'E', за которым следуют одна или несколько цифр.

По-видимому, целочисленный тип имеет приоритет над типом строки (т.е. он может так же легко выполнить сравнение путем литья int 0 в строку, которая затем вернет False). Это указано в операторе сравнения doc:

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

Спасибо за интересный вопрос, который заставил меня сделать некоторые исследования и узнать что-то новое!

Ответ 4

in_array предполагается использовать для индексированных массивов ([0], [1], [2] и т.д.), а не со словарем, который вы определили (хранилище ключей).

Если вы хотите проверить, содержит ли ваш массив $arr '0', попробуйте вместо этого использовать функцию PHP array_key_exists - http://php.net/manual/en/function.array-key-exists.php.

var_dump(array_key_exists(0, $arr));

Ответ 5

Тип сравнения (третий параметр) требует больше системных ресурсов и больше времени. Просто сделайте это:

$x=0;
$result=in_array($x.'',array('ABC','BAC','12c','54'));
var_dump($result);