php in_array() При проверке нуля в массивах со сторками возвращает true -- причина и решение.

Для начала небольшой тестовый код:

<?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); 

Key Words for FKN + antitotal forum (CS VSU):