I am not getting what is wrong with this code. It's returning "Found", which it should not.
$lead = "418176000000069007";
$diff = array("418176000000069003","418176000000057001");
if (in_array($lead,$diff))
echo "Found";
else
echo "Not found";
Note: this behavior was changed in PHP 5.4.
By default,
in_array
uses loose comparison (==
), which means numeric strings are converted to numbers and compared as numbers. Before PHP 5.4, if you didn't have enough precision in your platform's floating-point type, the difference was lost and you got the wrong answer.A solution is to turn on
strict
comparison (===
) by passing an extraBoolean
parameter toin_array
:Then the strings are compared as strings with no numeric coercion. However, this means you do lose the default equivalence of strings like "01234" and "1234".
This behavior was reported as a bug and fixed in PHP 5.4. Numeric strings are still converted to numbers when compared with
==
, but only if the value of the string fits in the platform's numeric type.From PHP Manual: String conversion to numbers:
As some others mentioned, you should use strict for in_array:
Some mentioned
PHP_INT_MAX
. This would be2147483647
on my system. I'm not quite sure if this is the problem as the manual states:But floating point precision should be high enough...
Whatever might be the "real" source of this problem, simply use strict for
in_array
to fix this problem.If that is your problem and you really want to compare/find in array then there is a trick
i.e. somehow you have to prepend a perticular character to every number. They will behave as strings in comparison and hence give correct result.