$a = '212345678912000005';
$b = '212345678912000001';
var_dump($a == $b);
このコードの出力は bool(true) であり、この判断によって 2 つが等しいと結論付けられることを示します。同様の機能は、in_array() 関数の 3 番目のパラメーターが false であるか設定されていない場合に発生します。文字列 これは数値であるため、long または double (C 言語のデータ型) に変換してから判断します - zendi_smart_strcmp を使用します。ただし、ソース コードのコメントには、ステートメントがオーバーフロー状況を考慮していると記載されています
。} else if (dval1 == dval2 && !zend_finite(dval1)) {
/* 両方の値がオーバーフローし、同じ符号を持ちます。
* したがって、数値比較は不正確になります */
goto string_cmp;
}
dval1 と dval2 はそれぞれ double に変換された 2 つの文字列の値ですが、なぜこの判断が正しくないのでしょうか?さらに調べてみましょう。
解決策: 2 つの等号「==」の代わりに 3 つの等号「===」を使用します。in_array() 関数は 3 番目のパラメーターを true に設定します: in_array('val', $array, true)。