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ł?



@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);

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ć.


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


0

Co powiesz na to:

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

    return count(array_intersect($searchForKeys, $searchableArrayKeys)) == count($searchForKeys); 
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.