in_array複数の値


110

次のような複数の値を確認するにはどうすればよいですか。

$arg = array('foo','bar');

if(in_array('foo','bar',$arg))

これは一例ですので、もう少しよく理解できれば、うまくいきません。

回答:


200

ターゲットを干し草の山と交差させ、交差がターゲットと正確に等しいことを確認します。

$haystack = array(...);

$target = array('foo', 'bar');

if(count(array_intersect($haystack, $target)) == count($target)){
    // all of $target is in $haystack
}

結果の交差のサイズがターゲット値の配列と同じサイズであることを確認するだけでよいことに注意してください。つまり$haystack、のスーパーセットです$target

の少なくとも1つの値$targetがにもあることを確認するには$haystack、次のチェックを実行します。

 if(count(array_intersect($haystack, $target)) > 0){
     // at least one of $target is in $haystack
 }

13
このソリューションは最適ではありません。$ needles = array(1,2); $ haystack = array(1,1,2,3); return(count(array_intersect($ haystack、$ needles))== count($ needles)); これはfalseを返しますが、これは良くありません。Rok Kraljのソリューションはこの場合に適しています。
ihtus 14年

1
これらの配列は一意のデータを保持する必要があると思います。そうしないと、このソリューションは機能しません
Hashan Kanchana

182

開発者は、おそらく集合演算(差分、和集合、交差)を学ぶ必要があります。配列を1つの「セット」として、そしてキーを検索してもう1つを想像できます。

すべての針が存在するかどうかを確認します

function in_array_all($needles, $haystack) {
   return empty(array_diff($needles, $haystack));
}

echo in_array_all( [3,2,5], [5,8,3,1,2] ); // true, all 3, 2, 5 present
echo in_array_all( [3,2,5,9], [5,8,3,1,2] ); // false, since 9 is not present

針が存在するかどうかを確認します

function in_array_any($needles, $haystack) {
   return !empty(array_intersect($needles, $haystack));
}

echo in_array_any( [3,9], [5,8,3,1,2] ); // true, since 3 is present
echo in_array_any( [4,9], [5,8,3,1,2] ); // false, neither 4 nor 9 is present

8
注:このタイプの配列宣言は> = PHP 5.4です
Claudiu Hojda 14年

厳密な比較を実行する必要がない場合の優れたソリューション。
かすかな信号2017年

14
if(in_array('foo',$arg) && in_array('bar',$arg)){
    //both of them are in $arg
}

if(in_array('foo',$arg) || in_array('bar',$arg)){
    //at least one of them are in $arg
}

7

@Rok Kraljの回答(最高のIMO)から離れて、干し草の山に針が存在するかどうかを確認します。(bool)代わりに、!!コードレビューで混乱する可能性がある針を使用できます。

function in_array_any($needles, $haystack) {
   return (bool)array_intersect($needles, $haystack);
}

echo in_array_any( array(3,9), array(5,8,3,1,2) ); // true, since 3 is present
echo in_array_any( array(4,9), array(5,8,3,1,2) ); // false, neither 4 nor 9 is present

https://glot.io/snippets/f7dhw4kmju


9
これは、新しい回答としてよりも、ロックの回答に関するコメントとして役立つでしょう。
かすかな信号2017年

@ジェイミンどのように(あなたはゼロの詳細を提供しました)...私にとって完全にうまく機能しますglot.io/snippets/f7dhw4kmju
sMyles

@sMyles整数ではなく配列の文字列値を使用してみました。一度お試しいただき、お知らせください。
ジェイミン2018

@Jayminにはまだ問題がありませんglot.io/snippets/f7dhw4kmju
sMyles

array_intersectは空または空でない配列を返すため、このブール変換は適切ではありません。@ rok-kraljソリューションが唯一の推奨ソリューションです。
codelearner

3

IMHOマークエリオットのソリューションは、この問題に最適です。配列要素間でより複雑な比較演算を行う必要があり、PHP 5.3を使用している場合は、次のようなことも考えられるでしょう。

<?php

// First Array To Compare
$a1 = array('foo','bar','c');

// Target Array
$b1 = array('foo','bar');


// Evaluation Function - we pass guard and target array
$b=true;
$test = function($x) use (&$b, $b1) {
        if (!in_array($x,$b1)) {
                $b=false;
        }
};


// Actual Test on array (can be repeated with others, but guard 
// needs to be initialized again, due to by reference assignment above)
array_walk($a1, $test);
var_dump($b);

これはクロージャに依存しています。比較機能はより強力になる可能性があります。幸運を!


私はすでにすべてを行う方法を変更したので、最終出力ではどちらの方法でもそれを行う必要はありませんでしたが、あなたの入力とあなたの時間のおかげで、常に学ぶのは良いことです!
ダリル2011

2
if(empty(array_intersect([21,22,23,24], $check_with_this)) {
 print "Not found even a single element";
} else {
 print "Found an element";
}

array_intersect()は、すべての引数に存在するarray1のすべての値を含む配列を返します。キーは保持されることに注意してください。

すべてのパラメータに値が存在するarray1のすべての値を含む配列を返します。


empty()-変数が空かどうかを判別

varが存在し、空でもゼロでもない値がある場合は、FALSEを返します。それ以外の場合はTRUEを返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.