in_array
次のシナリオでの動作を理解しようとしていました。
$arr = array(2 => 'Bye', 52, 77, 3 => 'Hey');
var_dump(in_array(0, $arr));
の戻り値in_array()
はブール値true
です。ご覧のとおり、に等しい値はありませ0
ん。誰かが関数がtrueを返す理由を理解するのを手伝ってください。
ドキュメントのコメントによると、これは既知の問題です。次の例を検討してください。
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
意味します。0
Bye
通話に3番目のパラメータtrue
(厳密モード)を追加してみてください。in_array
これは、ゆるい比較と型のジャグリングの結果です。
緩やかな比較とは、要素を比較するときに PHP が==
notを使用していることを意味します。は、2 つの変数の型が等しいことを比較するのではなく、それらの値のみを比較しますが、型と値が一致することを保証します (例: とを比較)。===
==
===
0 == FALSE
0 === 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で指定されています。
数値を文字列と比較する場合、または比較に数値文字列が含まれる場合、各文字列は数値に変換され、数値として比較が実行されます。
いくつかの調査を行い、何か新しいことを学ぶようになった興味深い質問をありがとう!
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));