43

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";
4

9 回答 9

139

注意:此行为在 PHP 5.4 中已更改。

默认情况下,in_array使用松散比较 ( ==),这意味着将数字字符串转换为数字并作为数字进行比较。在 PHP 5.4 之前,如果您的平台的浮点类型没有足够的精度,就会丢失差异并且得到错误的答案。

一种解决方案是通过将额外参数传递给来打开strict比较 ( ) :===Booleanin_array

  $lead = "418176000000069007";
  $diff = array("418176000000069003", "418176000000057001");

  if ( in_array($lead, $diff, true) ) 
    echo "Found";
  else
    echo "Not found";

然后将字符串作为没有数字强制的字符串进行比较。但是,这意味着您确实失去了“01234”和“1234”等字符串的默认等效性。

此行为被报告为错误并在 PHP 5.4 中修复。与 比较时,数字字符串仍会转换为数字==,但前提是字符串的值适合平台的数字类型。

于 2012-05-02T06:34:16.417 回答
56

注意:这是 PHP 旧版本中的错误,并在PHP 5.4新版本中得到纠正。

这是因为存储数量的限制PHP

这里真正的问题是因为PHP_INT_MAX- 在我们的案例中超出了值。

尝试echo/print_r $lead$diff使用引号。会导致

$lead ---> 418176000000070000  
$diff ---> Array ( [0] => 418176000000070000 [1] => 418176000000060000 )

所以,在这种情况下,in_array结果是真的!

所以通过将strict第三in_array()个参数设置in_array()true

     if(in_array($lead,$diff,true)) //use type too
       echo "Found";
     else
       echo "Not found";
?>

尝试这个。它会起作用的。

于 2012-05-02T06:32:49.397 回答
16

It's because of one defect in PHP. 418176000000069007 is modified to 2147483647 (integer limit of PHP). That is why you are getting Found.

try 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. 
于 2012-05-02T06:31:32.920 回答
6

值超过PHP_INT_MAX。尝试做if(in_array($lead,$diff,true))

于 2012-05-02T06:33:44.560 回答
5

in_array应该严格。

$lead = "418176000000069007";
  $diff = array("418176000000069003","418176000000057001");

  if(in_array($lead,$diff,true)) 
    echo "Found";
  else
    echo "Not found";

此问题是由于您的数字超出了定义的整数限制

注意:最大值取决于系统。32 位系统的最大有符号整数范围为-21474836482147483647。因此,例如在这样的系统上,intval('1000000000000')将返回2147483647. 64 位系统的最大有符号整数值为9223372036854775807.

于 2012-05-02T06:38:38.027 回答
3

尝试使用方括号并使用严格模式:

$lead = "418176000000069007";
$diff = array("418176000000069003","418176000000057001");

if(in_array($lead, $diff, true)) {
    echo "Found";
} else {
    echo "Not found";
}
于 2012-05-02T06:35:24.173 回答
2

如果第三个参数 strict 设置为 TRUE,那么该in_array()函数还将检查大海捞针的类型,并且因为限制超出了最大整数值。

因此,如果 PHP 遇到超出整数类型范围的数字,它将被解释为浮点数。此外,导致数字超出整数类型范围的操作将改为返回浮点数。检查 PHP 手册。

if (in_array($lead,$diff,true))
于 2012-05-02T11:47:47.483 回答
2

来自PHP 手册:字符串转换为数字

在数字上下文中评估字符串时,结果值和类型确定如下。

如果字符串包含任何字符“.”、“e”或“E”,则该字符串将被评估为浮点数。否则,它将被评估为整数。

正如其他一些人提到的,您应该对in_array使用 strict :

bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) 除非设置了严格,否则使用松散比较在 haystack 中搜索针。

有人提到PHP_INT_MAX。这将2147483647在我的系统上。我不太确定这是否是手册所述的问题:

如果 PHP 遇到超出整数类型范围的数字,它将被解释为浮点数。此外,导致数字超出整数类型范围的操作将改为返回浮点数。

但是浮点精度应该足够高......

不管这个问题的“真正”来源是什么,只需使用 strict forin_array来解决这个问题。

于 2012-05-09T05:16:10.370 回答
2

如果那是您的问题,并且您真的想在数组中进行比较/查找,那么有一个技巧

$lead = "a418176000000069007";
$diff = array("a418176000000069003","a418176000000057001");

if (in_array($lead,$diff))
    echo "Found";
else
    echo "Not found";

即,您必须以某种方式为每个数字添加一个特定的字符。相比之下,它们将表现为字符串,因此会给出正确的结果。

于 2012-05-24T04:25:08.123 回答