28

in_array次のシナリオでの動作を理解しようとしていました。

$arr = array(2 => 'Bye', 52, 77, 3 => 'Hey');
var_dump(in_array(0, $arr));

の戻り値in_array()はブール値trueです。ご覧のとおり、に等しい値はありませ0ん。誰かが関数がtrueを返す理由を理解するのを手伝ってください。

4

5 に答える 5

63

ドキュメントのコメントによると、これは既知の問題です。次の例を検討してください。

in_array(0, array(42));      // FALSE
in_array(0, array('42'));    // FALSE
in_array(0, array('Foo'));   // TRUE

これを回避するには、3番目のパラメーターを指定trueして、比較を厳密モードにします。これにより、値だけでなくタイプも比較されます。

var_dump(in_array(0, $arr, true));

strictモードですべてのチェックを行う必要がない他の回避策が存在します。

in_array($value, $my_array, empty($value) && $value !== '0');

しかし、なぜ?

このすべての背後にある理由は、おそらく文字列から数値への変換です。「Bye」から数値を取得しようとすると、が与えられ0ます。これは、検索するように求めている値です。

echo intval("Bye"); // 0

これを確認するために、一致するarray_searchに関連付けられているキーを見つけるために使用できます。

$arr = array(2 => 'Bye', 52, 77, 3 => 'Hey');
echo array_search(0, $arr);

この場合、返されるキーはです。これは、整数への変換で検出されることを2意味します。0Bye

于 2012-12-12T19:06:22.523 に答える
9

通話に3番目のパラメータtrue(厳密モード)を追加してみてください。in_array

于 2012-12-12T19:05:35.577 に答える
4

これは、ゆるい比較と型のジャグリングの結果です。

緩やかな比較とは、要素を比較するときに PHP が==notを使用していることを意味します。は、2 つの変数の型が等しいことを比較するのではなく、それらの値のみを比較しますが、型と値が一致することを保証します (例: とを比較)。========0 == FALSE0 === FALSE

したがって、基本的に、あなたの in_array 関数はチェックしています:

0 == 'Bye'
0 == 'Hey'
0 == 77

アレイの作成方法によっては、52 が失われることに注意してください。

そのため、次の点に注意してください。

print (0 == 'Bye');

1 が得られます。どうやら、PHP は'Bye' を 0 に型ジャグリングしています。これは、文字列を int にキャストするときに発生するのと同じことです。たとえば、0(int) 'string'なります。強調を追加):

値は文字列の最初の部分によって与えられます。文字列が有効な数値データで始まる場合、これが使用される値になります。 それ以外の場合、値は 0 (ゼロ) になります。有効な数値データは、オプションの符号であり、その後に 1 つ以上の数字 (オプションで小数点を含む) が続き、その後にオプションの指数が続きます。指数は、'e' または 'E' の後に 1 つ以上の数字が続きます。

明らかに、整数型は文字列型よりも優先されます (つまり、int 0 を文字列にキャストすることで比較を行うのと同じくらい簡単で、False を返すことができます)。これは、比較演算子 docで指定されています。

数値を文字列と比較する場合、または比較に数値文字列が含まれる場合、各文字列は数値に変換され、数値として比較が実行されます。

いくつかの調査を行い、何か新しいことを学ぶようになった興味深い質問をありがとう!

于 2012-12-12T19:16:26.487 に答える
1

in_arrayは、定義したディクショナリ(Key-Valueストア)ではなく、インデックス付き配列([0]、[1]、[2]など)で使用されることになっています。

配列$arrに「0」が含まれているかどうかを確認する場合は、代わりにPHP関数array_key_exists(http://php.net/manual/en/function.array-key-exists.php )を使用してみてください。

var_dump(array_key_exists(0, $arr));
于 2012-12-12T19:07:12.770 に答える