簡體   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