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?
Ответы
Ответ 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);