Почему PHP функция array_keys работает не так как ожидалось
Пример кода:
$input = array(
52058 => '7008E-805',
52059 => '7008E-806',
52060 => '7010-805',
52061 => '7012J-805',
52062 => '7012J-805'
);
$search_value = '7008E-805';
$strict = false;
$result = array_keys($input, $search_value, $strict);
print_r($result);
На выходе получаем:
Array
(
[0] => 52058
[1] => 52059
)
Почему? Ведь ожидается, что будет найден только один ключ.
Если мы поставим:
$strict = true;
то все работает правильно. Но кажется, что так должно быть и без $strict = true.
Кстати, пример кода - это разбор кусочка реальных данных. Во всех других случаях array_keys работает как надо и только при поиске '7008E-805' дает такой странный результат.
Ответы (1 шт):
https://www.php.net/manual/ru/language.types.numeric-strings.php
Потому что 7008E-805 это валидная числовая строка 7008×10-805, но поскольку это выходит за возможности представления чисел с плавающей точкой, то это значение приводится к нулю. Вторая строка аналогично приводится к нулю и мы получаем два нулевых значения которые array_keys и нашёл.
Именно поэтому и нужно использовать строгое сравнение, что бы PHP не пытался «играть с типами».