Удивительное поведение in_array
В процессе кодинга на PHP 7.4 неожиданно обнаружил совершенно нелогичное поведение функции in_array()
$parameter = "RITY";
$value = "hfg";
if( $parameter === "RITY" && ! in_array($value, [0, 1]) )
echo 1;
else
echo 2;
Этот код выдаёт 2! Если кто-то не верит - проверьте на https://sandbox.onlinephpfunctions.com/ При том что массив содержит только 0 и 1, а в $value произвольная строка - код ведёт себя так, как будто элемент "hfg" есть в массиве [0, 1] Как это объяснить???
Ответы (1 шт):
Функция in_array имеет такую сигнатуру:
in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) : bool
Если третий параметр strict установлен в TRUE, тогда функция in_array() также проверит соответствие типов параметра needle и соответствующего значения массива haystack.
Соответственно, в вашем примере не происходит сравнения типов. Строка hfg будет преобразовываться в целое число. Из документации:
Если строка распознается как числовое значение, результирующее значение и тип определяется так, как показано далее.
Если строка не содержит какой-либо из символов '.', 'e', или 'E', и значение числа помещается в пределы целых чисел (определенных PHP_INT_MAX), строка будет распознана как целое число (integer). Во всех остальных случаях она считается числом с плавающей точкой (float).
Значение определяется по начальной части строки. Если строка начинается с верного числового значения, будет использовано это значение. Иначе значением будет 0 (ноль). Верное числовое значение - это одна или более цифр (могущих содержать десятичную точку), по желанию предваренных знаком с последующим необязательным показателем степени. Показатель степени - это 'e' или 'E' с последующими одной или более цифрами.
Т.е. $value будет преобразовано в 0. А это значение в массиве есть.
Чтобы исправить ситуацию, достаточно вызывать функцию так
in_array($value, [0, 1], true)