Почему такое странное поведение in_array?
Раз:

Если strict не установлен, то при поиске будет использовано нестрогое сравнение.

Два:

В случае, если вы сравниваете число со строкой или две строки, содержащие числа, каждая строка будет преобразована в число, и сравниваться они будут как числа.

Три:

Значение определяется по начальной части строки. Если строка начинается с верного числового значения, будет использовано это значение. Иначе значением будет 0 (ноль).
Это поведение и вправду очень странное, но корректируется третьим параметром, выставленным в TRUE

if (in_array($el, $arr, TRUE))