2013-05-28 20 views
9

私はin_array関数に問題があります。針が0の場合、in_arrayはtrueを返します

in_array(0, array('card', 'cash')) 

が、私はそれをどのようにどのように防ぐことができ、それは不可能です:戻りtrue以下のテスト?

しかし

in_array(null, array('card', 'cash')) 

戻りfalse

+1

(INT)0中(int型) 'カード' から

? –

+4

LOOSE TYPING ...数値を文字列と比較するので、文字列は数値に変換され、この場合は0が与えられ、0 == 0となります。STRICT引数を使用してください。 –

+0

ありがとうございます@ MarkBaker – hsz

答えて

23

数字で始まらない文字列を数値にキャストすると、PHPで0が返されます。これはまさに0といくつかの文字列を比較するときに起こります。さまざまなタイプ間の比較がどのように行われるかの詳細については、PHP docsを参照してください。

緩い型の比較を避けるために、in_arrayの3番目の引数(trueに設定)を使用します。

in_array(0, array('card', 'cash'), true) === false 
+0

私が必要とする答え。ありがとうございました ! – hsz

0

答えはそう、文字列に0をキャストすることができます。

in_array((string) 0, array('card', 'cash')) 

0は、いくつかの変数を指定でき、そのキャストが役に立つことができることを覚えておいてください。

7

あなたはin_arrayで比較するとき、互換性のないデータ型に を比較しながら 文字列をintに変換され、それがcashまたはcardを意味は0

に変換され、これはあなたが2つのオプションを持っているので、型キャスト

のすべてです

1。

in_array(0, array('card', 'cash'), true) === false; 

参照データ型と一致しますtrueに型キャストin_array上

in_array(string(0), array('card', 'cash'))) === false; 

2 .USE third parameterdocumentation

+0

少し遅れてそれに答える.. – alwaysLearn

2

あなたは '厳格な' パラメータ使って、それを防ぐことができます。

var_export(in_array(0, array('card', 'cash'), true)); 

var_export(in_array(null, array('card', 'cash'), true)); 

はどちらの場合もfalseを返します。 the docs to in_array()

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. 
関連する問題