为什么in_array()错误地用这些(大数字)string返回true?
我没有得到这个代码有什么问题。 它返回“find”,它不应该。
$lead = "418176000000069007"; $diff = array("418176000000069003","418176000000057001"); if (in_array($lead,$diff)) echo "Found"; else echo "Not found";
这是因为PHP
中的数字存储的限制, 这是一个错误,并在更新版本的PHP
纠正和解决。
值超过PHP_INT_MAX
。
尝试echo
/ print_r
$lead
和$diff
而不使用引号。 这将会导致
$lead ---> 418176000000070000 $diff ---> Array ( [0] => 418176000000070000 [1] => 418176000000060000 )
所以在这种情况下in_array
结果是真的!
所以通过在in_array()
设置第三个参数为true
在in_array()
使用strict
比较
if(in_array($lead,$diff,true)) //use type too echo "Found"; else echo "Not found"; ?>
尝试这个。 它会工作。
注意:这个行为在PHP 5.4中改变了。
默认情况下, in_array
使用宽松比较( ==
),这意味着数字string被转换为数字并作为数字进行比较。 在PHP 5.4之前,如果在平台的浮点types中没有足够的精度,那么差异就会丢失,并且你得到了错误的答案。
一个解决scheme是通过将一个额外的Boolean
parameter passing给in_array
来打开strict
比较( ===
):
$lead = "418176000000069007"; $diff = array("418176000000069003", "418176000000057001"); if ( in_array($lead, $diff, true) ) echo "Found"; else echo "Not found";
然后string被比较为没有数字强制的string。 但是,这意味着您确实会丢失“01234”和“1234”等string的默认等值。
这种行为被报告为一个错误,并在PHP 5.4中修复。 只有当string的值符合平台的数字types时,数字string仍然会被转换为数字。
这是因为PHP的一个缺陷。 418176000000069007
修改为2147483647(PHP的整数限制)。 这就是为什么你正在Found
。
试试in_array($lead, $diff, true)
If the third parameter strict is set to TRUE then the in_array() function will also check the types of the needle in the haystack.
值超过PHP_INT_MAX
。 试试if(in_array($lead,$diff,true))
。
in_array
应该被限制。
$lead = "418176000000069007"; $diff = array("418176000000069003","418176000000057001"); if(in_array($lead,$diff,true)) echo "Found"; else echo "Not found";
这个问题是由于你的数字超出了定义的整数限制
注意:最大值取决于系统。 32位系统的最大有符号整数范围是-2147483648
到2147483647
。 所以例如在这样的系统上, intval('1000000000000')
将返回2147483647
。 64位系统的最大有符号整数值是9223372036854775807
。
尝试使用括号并使用严格模式:
$lead = "418176000000069007"; $diff = array("418176000000069003","418176000000057001"); if(in_array($lead, $diff, true)) { echo "Found"; } else { echo "Not found"; }
如果将第三个参数strict设置为TRUE,那么in_array()
函数也将检查干草堆中针的types,并且因为该限制超出了最大整数值。
所以如果PHP遇到一个超出整数types范围的数字,它将被解释为一个float。 此外,导致超出整数types范围的数字的操作将返回一个浮点数。 检查PHP手册。
if (in_array($lead,$diff,true))
从PHP手册:string转换为数字 :
当在数值上下文中计算string时,结果值和types如下确定。
如果string包含任何字符“。”,“e”或“E”,则该string将被评估为浮点数。 否则,它将被评估为一个整数。
正如其他人提到的,你应该使用in_array严格:
bool in_array ( mixed $needle , array $haystack [, bool $strict =
FALSE])除非设置严格,否则使用宽松比较来searchhaystack。
一些提到了PHP_INT_MAX
。 这将是我的系统上的2147483647
。 我不太清楚这是否是手册中提到的问题:
如果PHP遇到超出整数types范围的数字,它将被解释为float。 此外,导致超出整数types范围的数字的操作将返回一个浮点数。
但是浮点精度应该足够高…
无论什么可能是这个问题的“真正的”来源,只要使用in_array
严格来解决这个问题。
如果这是你的问题,你真的想比较/在数组中find然后有一个窍门
$lead = "a418176000000069007"; $diff = array("a418176000000069003","a418176000000057001"); if (in_array($lead,$diff)) echo "Found"; else echo "Not found";
即不知何故,你必须预先对每个数字的特性。 他们会比较行为,因此给出正确的结果。