2017-10-06 2 views
1
$array = ['a', 'b', 'c', 'd']; 
$vars = ['a', 'f', 'g']; 

foreach ($vars as $var) { 
    if (in_array($var, $array)) { 
     return true; 
    } else { 
     return false; 
    } 
} 

が存在するかどうかはどのように確認できますか?だけそのうちの一つは、他のすべてのfalseをしている場合、それは問題ではありません、しかし、以上の1 true値がある場合は、チェック複数の変数の一つは、配列内の

は、たとえば['a', 'b', 'c', 'g']ために私が最初にtrue値と端で停止する機能が欲しいtrueをする必要がありますプロセス。単にarray_intersect機能付き

+2

すべてをチェックするまで、「falseを返す」ことはしないでください。ループの下で 'return false'を動かす – apokryfos

答えて

2

は、あなたが疑問に持っているコードはかなりこのことについてに行くための最良の方法です。あなただけのすべての値が処理され得るように、ループの後にreturn falseを移動する必要があります。

foreach ($vars as $var) { 
    if (in_array($var, $array)) { 
    return true; 
    } 
} 

return false; 

これはarray_intersectしながら溶液に同じように動作しますが、唯一の最小量を処理する必要があるという利点を有しますループ。次のデータを考えてみましょう:

$vars = [1, 2, 3, 4, ... 1,000,000,000]; 
$array = [1, 10, ...]; 

ループの外に壊しソリューションは唯一の最初までチェックする必要があります一方array_intersectを使用したソリューションは、に対してをチェック$array内のすべての要素を$vars内のすべてのの要素が必要になります一致。両方の配列が非常に大きい場合は、2つのネストされたループforeachを使用してこれをさらに最適化することができます。

あなたの配列が小さい場合、array_intersectを使用すると、違いが気付かれず、コードが読みやすくなります。

+0

は 'falseを返します;'このフォームに一致するものがあれば 'return true'をオーバーライドしますか? – AXAI

+0

いいえ - 関数は、最初の 'return'ステートメントに達するまで実行されません。それ以降は何も処理されません。 – iainn

5

:私にとって

$arr = ['a', 'b', 'c', 'd']; 
$vars = ['a', 'f', 'g']; 

$result = count(array_intersect($vars, $arr)) == 1;  
var_dump($result); // true 
+0

'> = 1'である必要がありますか?また、基本ループの代わりにarray_intersectを使用することの欠点は、最初の成功した結果で中断することができないということです。小さな配列の場合でも問題ありません。 – iainn

+0

@iainn私は '== 1'が良いと思うので、ユーザーが2つ以上の有効な値を入力しないようにしたいからです。 – AXAI

+0

@AXAIおそらく私は誤解していました。複数の一致する値は大丈夫だと思いましたか?あなたは*少なくとも* 1をチェックしたかっただけです。とにかく、それがあなたのために働くなら、それは重要なことです。 – iainn

関連する問題