繁体   English   中英

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

[英]Why does in_array() wrongly return true with these (large numeric) strings?

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

$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_array传递一个额外的Boolean参数来打开strict比较( === ):

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

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

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

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

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

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

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

尝试在不使用引号的情况下echo / print_r $lead$diff 它会导致

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

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

因此,通过将in_array()的第三个参数设置为truein_array()使用strict比较

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

试试这个。 它会起作用。

这是因为 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 位系统的最大有符号整数范围为-21474836482147483647 因此,例如在这样的系统上, 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()函数还将检查大海捞针的类型,并且因为限制超出了最大整数值。

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

if (in_array($lead,$diff,true))

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

当在数字上下文中计算字符串时,结果值和类型按如下方式确定。

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

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

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

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

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

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

无论此问题的“真正”根源是什么,只需对in_array使用 strict 即可解决此问题。

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

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

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

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

如果 (in_array(<title> , $SomeArray)) 返回真&lt;/div&gt;</title><div id="text_translate"><p> 我的问题是它无法检测到字符串中的每个单词。 类似于过滤器或标签或类别或排序的..</p><pre> $title = "What iS YouR NAME?"; $english = Array( 'Name', 'Vacation' ); if(in_array(strtolower($title),$english)){ $language = 'english'; } else if(in_array(strtolower($title),$france)){ $language = 'france'; } else if(in_array(strtolower($title),$spanish)){ $language = 'spanish'; } else if(in_array(strtolower($title),$chinese)){ $language = 'chinese'; } else if(in_array(strtolower($title),$japanese)){ $language = 'japanese'; } else { $language = null; }</pre><p> output 是 null.. =/</p></div>

[英]if (in_array(<title>, $SomeArray)) return true

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM