PHPが配列に別の配列のすべての配列値が含まれているかどうかを確認する


110
$all = array
(
    0 => 307,
    1 => 157,
    2 => 234,
    3 => 200,
    4 => 322,
    5 => 324
);
$search_this = array
(
    0 => 200,
    1 => 234
);

$ allにすべての$ search_this値が含まれているかどうかを確認し、trueまたはfalseを返します。何かアイデアはありますか?



@VishalKumarSahu完全に重複しているわけではありません:指定したリンクは、すべての要素が別の配列に含まれているかどうかではなく、任意の要素が別の配列に含まれているかどうかを確認する必要があります。
ステファン

回答:


159

array_intersect()を見てください。

$containsSearch = count(array_intersect($search_this, $all)) == count($search_this);

11
あなたは両方のcount()呼び出しを省略できることを知っていますか?
Wrikken 2013

1
@Wrikken中に値が並べ替えられませんarray_intersect()か?私は、意味します['a', 'b'] != ['b', 'a']
sbichenko 2013年

4
そしてそれでも:配列比較==$ aと$ bが同じキー/値のペアを持っている場合はTRUE」、順序は関係ありません(そのために使用します===
Wrikken

2
この回答は、$ all配列に一意の値のみが含まれていることを前提としています。そうでない場合は、array_intersects関数の$ all配列でarray_unique関数を使用できます。
13

5
@orrdのarray_diff解法はより明確です
Joseph Connolly

222

以前の答えはすべて、必要以上の作業を行っています。array_diffを使用するだけです。これが最も簡単な方法です。

$containsAllValues = !array_diff($search_this, $all);

それだけです。


4
ああ瞬間ありがとうございます。私は考えに来ましたarray_intersect
Derek Illchuk 14

19
これが答えになるはずです
Matthew

2
はい、それはそのようなより良い解決策です
Oleksandr Diudiun

1
交差するよりも良い解決策!
TheBosti 2017

1
私はこのページに出くわし、上記の解決策を使用しました。それは重複を説明したためです
Rayzor 2018

9

array_diffを使用すると少し短くなります

$musthave = array('a','b');
$test1 = array('a','b','c');
$test2 = array('a','c');

$containsAllNeeded = 0 == count(array_diff($musthave, $test1));

// this is TRUE

$containsAllNeeded = 0 == count(array_diff($musthave, $test2));

// this is FALSE


0

これはどう:

function array_keys_exist($searchForKeys = array(), $searchableArray) {
    $searchableArrayKeys = array_keys($searchableArray);

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