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
- 2393 reads