为什么in_array() 错误地返回这些(大数字)字符串的 true?

2022-08-30 11:33:41

我不明白这个代码有什么问题。它返回“已找到”,它不应该返回。

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

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

答案 1

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

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

解决方案是通过将额外的参数传递给以下命令来启用比较 ():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 中修复。与 相比,数字字符串仍会转换为数字,但前提是字符串的值适合平台的数字类型。==


答案 2

注意:这是 PHP 旧版本中的一个错误,在 PHP 5.4 和更高版本中已得到纠正。

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

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

尝试/并且不使用引号。它将导致echoprint_r$lead$diff

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

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

因此,通过将第三个参数设置为strictin_array()in_array()true

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

试试这个。它会起作用。