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

标签 php arrays

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

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

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

最佳答案

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

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

一种解决方案是通过向 in_arrayBoolean 参数来打开 strict 比较 (===):

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

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

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

此行为 was reported as a bug并在 PHP 5.4 中修复。与 == 相比,数字字符串仍会转换为数字,但前提是字符串的值适合平台的数字类型。

关于php - 为什么 in_array() 使用这些(大数字)字符串错误地返回 true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10408740/

相关文章:

javascript - 缺少数组

c++ - 仅 header 实现中的大型静态数组

php - 如果条件为真,我如何写入 textarea 值

php - 检查产品是否可以在 WooCommerce 中下载

php - 如何创建具有双 GET 变量的数组

javascript - 如何从多个数组创建对象数组

c - for循环中的数组,C99

php - 通过 HTML 表单使用 PHP 更改 MySQL 表上的 ENUM 列是一个坏主意吗?

php - 如何使用 OOP 动态构建 PHP 表单?

PHP DateTime createFromFormat不会自然消亡