![](/img/trans.png)
[英]why does in_array return true when a value only begins with what is in an array
[英]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()
的第三個參數設置為true
在in_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 位系統的最大有符號整數范圍為-2147483648
到2147483647
。 因此,例如在這樣的系統上, 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))
當在數字上下文中計算字符串時,結果值和類型按如下方式確定。
如果字符串包含任何字符“.”、“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";
即不知何故,您必須為每個數字添加一個特定的字符。 相比之下,它們將表現為字符串,因此會給出正確的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.