43

I am not getting what is wrong with this code. It's returning "Found", which it should not.

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

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

9 に答える 9

139

注:この動作はPHP5.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」などの文字列のデフォルトの同等性が失われることを意味します。

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

于 2012-05-02T06:34:16.417 に答える
56

注:これはPHPの古いバージョンのバグであり、新しいバージョンで修正されています。PHP 5.4

の数のストレージの制限のためですPHP

ここでの本当の問題はPHP_INT_MAX、この場合の値を超えたためです。

echo引用符を使用せずに/print_r $leadを試してください$diff。結果として

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

したがって、この場合、in_array結果は真です!

したがって、3番目の引数を次のように設定してstrict比較を使用しますin_array()in_array()true

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

これを試して。それが動作します。

于 2012-05-02T06:32:49.397 に答える
16

これは、PHPの1つの欠陥が原因です。4181760000000690072147483647(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. 
于 2012-05-02T06:31:32.920 に答える
6

値がを超えてPHP_INT_MAXいます。if(in_array($lead,$diff,true))代わりにやってみてください。

于 2012-05-02T06:33:44.560 に答える
5

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

于 2012-05-02T06:38:38.027 に答える
3

角かっこを使用して、厳密モードを使用してみてください。

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

if(in_array($lead, $diff, true)) {
    echo "Found";
} else {
    echo "Not found";
}
于 2012-05-02T06:35:24.173 に答える
2

3番目のパラメーターstrictがTRUEに設定されている場合、in_array()関数は干し草の山の針のタイプもチェックします。これは、制限が最大整数値を超えているためです。

したがって、PHPが整数型の境界を超える数に遭遇した場合、代わりにfloatとして解釈されます。また、整数型の範囲を超える数になる操作は、代わりにfloatを返します。PHPのマニュアルを確認してください。

if (in_array($lead,$diff,true))
于 2012-05-02T11:47:47.483 に答える
2

PHPマニュアルから:文字列から数値への変換:

文字列が数値コンテキストで評価される場合、結果の値とタイプは次のように決定されます。

文字列に「。」、「e」、または「E」のいずれかの文字が含まれている場合、文字列は浮動小数点数として評価されます。それ以外の場合は、整数として評価されます。

他の人が述べたように、in_arrayにはstrictを使用する必要があります。

bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE])strictが設定されていない限り、緩い比較を使用して干し草の山で針を検索します。

いくつか言及しPHP_INT_MAXました。これは2147483647私のシステムにあります。マニュアルに記載されているように、これが問題であるかどうかはよくわかりません。

PHPが整数型の範囲を超える数値に遭遇した場合、代わりに浮動小数点数として解釈されます。また、整数型の範囲を超える数になる操作は、代わりにfloatを返します。

ただし、浮動小数点の精度は十分に高くなければなりません...

この問題の「本当の」原因が何であれ、この問題in_arrayを修正するには、単にstrictforを使用します。

于 2012-05-09T05:16:10.370 に答える
2

それがあなたの問題であり、本当に配列で比較/検索したい場合は、トリックがあります

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

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

つまり、どういうわけか、すべての数字の前に特定の文字を追加する必要があります。それらは比較すると文字列として動作するため、正しい結果が得られます。

于 2012-05-24T04:25:08.123 に答える