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

www*_*.me 43 php arrays

我没有得到这个代码的错误.它返回"发现",它不应该.

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

if (in_array($lead,$diff))
    echo "Found";
else
    echo "Not found";
Run Code Online (Sandbox Code Playgroud)

Mar*_*eed 139

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

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

解决方案是通过将额外参数传递给:来打开strictcomparison(===):Booleanin_array

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

  if ( in_array($lead, $diff, true) ) 
    echo "Found";
  else
    echo "Not found";
Run Code Online (Sandbox Code Playgroud)

然后将字符串作为字符串进行比较,不进行数字强制.但是,这意味着您会丢失默认的字符串等效项,如"01234"和"1234".

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

  • @gavriel:不幸的是,这不是真的; 如果字符串看起来像一个数字,它将转换为一个.添加一些零,以便即使在64位安装上数字比较也会失去精度,并且很容易证明:`php -r'echo("4181760000000000069003"=="4181760000000000057001"),"\n";'`返回1 . (11认同)
  • @tomerw:问题得到了回答,所以我们不应该在评论中切入正题; 如果你愿意,可以随意开始聊天.但我会说(1)你的代码实际上返回1(= true),(2)我已经放弃了PHP的行为,与我对"应该"做什么的看法有任何相似之处.:) (9认同)

aru*_*run 56

正是由于存储数量的限制PHP,这是一个错误,并在新版本中得到纠正和解决PHP.

价值超过PHP_INT_MAX.

试着echo/ print_r $lead$diff不使用引号.它会导致

$lead ---> 418176000000070000  
$diff ---> Array ( [0] => 418176000000070000 [1] => 418176000000060000 )
Run Code Online (Sandbox Code Playgroud)

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

所以通过在as中设置第三个参数来使用strict比较in_array()in_array()true

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

试试这个.它会工作.


Nau*_*hal 16

这是因为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. 
Run Code Online (Sandbox Code Playgroud)

  • 问题是,它为什么要将它转换为"int"? (9认同)
  • @Amit将`$ strict`设置为`true`:`in_array($ lead,$ diff,true)` (3认同)

web*_*mad 6

价值超过PHP_INT_MAX.尝试if(in_array($lead,$diff,true))改为做.


iea*_*tes 5

in_array 应该是严格的.

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

  if(in_array($lead,$diff,true)) 
    echo "Found";
  else
    echo "Not found";
Run Code Online (Sandbox Code Playgroud)

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

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