Because numerically, 084 and 84 both present the same number. Since by default in_array uses loose comparison, it will match them, as it will internally apply type conversion and both will be converted to 84, as they are numeric.
If you look at the in_array documentation, you will see it has a third parameter:
in_array ( mixed $needle , array $haystack , bool $strict = false ) : bool
which determines whether loose or strict comparison should be used. Setting it to true would give you the desired result.
For example, if you were to run the following commands:
var_dump(in_array(84, ['084', '756', '34']));
var_dump(in_array(84, ['084', '756', '34'], true));
var_dump(in_array('84', ['084', '756', '34'], true));
var_dump(in_array('084', ['084', '756', '34'], true));
they would output:
true // loose comparison, 84 == '084', both cast to numbers resulting in 84 being compared to 84
false // strict comparison, 84 !== '84', as one is int and the other string
false // strict comparison, '84' !== '084', as they're not identical strings, the second one has an extra character at the beginning
true // strict comparison, '084' === '084', identical strings