Удивительное поведение 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)
→ Ссылка