php in_array() При проверке нуля в массивах со сторками возвращает true -- причина и решение.
Primary tabs
Для начала небольшой тестовый код:
<?php
$array = array(
'egg' => true,
'cheese' => false,
'hair' => 765,
'goblins' => null,
'ogres' => 'no ogres allowed in this array'
);
$arr2 = array(
'egg', 'cheese', 'hair'
);
// далее получаем довольно странные результаты
pin(null, $array); // true
pin(false, $array); // true
pin(765, $array); // true
pin(763, $array); // true
pin('egg', $array); // true
pin('hhh', $array); // true
pin(array(), $array); // true
echo "----второй массив---- \n";
pin(0, $arr2); // true
pin(0, $arr2, true); // true
echo '----конец----';
function pin($needle, $array)
{
$newLine = "\n";
if ($needle === true) $pneedle = 'true';
else if ($needle === false) $pneedle = 'false';
else if (is_null($needle)) $pneedle = 'null';
else if (is_array($needle)) $pneedle = '[array]';
else $pneedle = $needle;
if (in_array($needle, $array))
{
echo "$pneedle: true $newLine";
} else {
echo "$pneedle: false $newLine";
}
}
Демонстрация сделана на основе этого замечания.
Все дело в том, как php приводит типы, так например когда мы делали проверку:
pin(0, $arr2); // true
--мы пытались в массиве из строк найти ноль, при этом любая строка при попытке привести её к числу превращется в ноль, потому в нестрогом сравнении мы и получаkb true.
Чтобы исключить подобные "неожиданности" используйте строгий режим сравнения, например:
pin(0, $arr2, true);
- Log in to post comments
- 2833 reads