in_array() がこれらの (大きな数値) 文字列に対して誤って true を返すのはなぜですか? 質問する

in_array() がこれらの (大きな数値) 文字列に対して誤って true を返すのはなぜですか? 質問する

このコードの何が間違っているのか分かりません。「Found」が返されますが、返されるべきではありません。

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

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

ベストアンサー1

注記:この動作は PHP 5.4 で変更されました。

デフォルトでは、in_array緩い比較 ( ==) を使用します。つまり、数値文字列は数値に変換され、数値として比較されます。PHP 5.4 より前では、プラットフォームの浮動小数点型の精度が十分でない場合、違いが失われ、間違った答えが得られました。

解決策としては、に追加のパラメータを渡してstrict比較 ( ) をオンにすることです。===Booleanin_array

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

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

次に、文字列は数値の強制変換のない文字列として比較されます。ただし、これは、「01234」と「1234」のような文字列のデフォルトの等価性が失われることを意味します。

この行動バグとして報告されたPHP 5.4 で修正されました。数値文字列は、と比較すると数値に変換されます==が、文字列の値がプラットフォームの数値型に適合する場合のみです。

おすすめ記事