php sprawdza, czy tablica zawiera wszystkie wartości tablicy z innej tablicy

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

Chciałbym się dowiedzieć, czy $ all zawiera wszystkie wartości $ search_this i zwraca prawdę lub fałsz. jakikolwiek pomysł?

Piotr
źródło
@VishalKumarSahu Niezupełnie duplikat: Twój podany link ma związek ze sprawdzeniem, czy JAKIEKOLWIEK elementy są zawarte w innej tablicy, a nie czy WSZYSTKIE elementy znajdują się w innej.
Stefan

Odpowiedzi:

159

Spójrz na array_intersect () .

$containsSearch = count(array_intersect($search_this, $all)) == count($search_this);
jasonbar
źródło
11
Wiesz, że możesz pominąć oba count()połączenia?
Wrikken
1
@Wrikken Czy wartości nie mogą zostać ponownie uporządkowane w trakcie array_intersect()? To znaczy, ['a', 'b'] != ['b', 'a'].
sbichenko
4
A nawet wtedy: porównanie tablic : ==PRAWDA, jeśli $ a i $ b mają te same pary klucz / wartość”. , więc kolejność nawet nie ma znaczenia (użyj ===do tego)
Wrikken
2
W tej odpowiedzi przyjęto, że tablica $ all zawiera tylko unikalne wartości. Jeśli tak nie jest, można użyć funkcji array_unique na tablicy $ all w funkcji array_intersects.
Relequestual
5
Rozwiązanie array_diff podane przez @orrd jest znacznie czystsze
Joseph Connolly,
224

Wszystkie poprzednie odpowiedzi wykonują więcej pracy, niż muszą. Po prostu użyj array_diff . Oto najprostszy sposób:

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

To wszystko, co musisz zrobić.

orrd
źródło
4
Dzięki za chwilę aha; Zacząłem się zastanawiać array_intersect.
Derek Illchuk
19
to powinna być odpowiedź
Matthew
2
Tak, to takie lepsze rozwiązanie
Oleksandr Diudiun
1
Lepsze rozwiązanie niż skrzyżowanie!
TheBosti
1
Natknąłem się na tę stronę i użyłem powyższego rozwiązania, ponieważ uwzględniono duplikaty
Rayzor
9

Nieco krótszy z 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
javigzz
źródło
3

Myślę, że szukasz funkcji przecięcia

array array_intersect ( array $array1 , array $array2 [, array $ ... ] )

array_intersect()zwraca tablicę zawierającą wszystkie wartości tablica1, które są obecne we wszystkich argumentach. Pamiętaj, że klucze są zachowane.

http://www.php.net/manual/en/function.array-intersect.php

James Kyburz
źródło
0

Co powiesz na to:

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

    return count(array_intersect($searchForKeys, $searchableArrayKeys)) == count($searchForKeys); 
}
K-Alex
źródło