Verifique se o array contém todos os valores do array de outro array

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

Eu gostaria de saber se $ all contém todos os valores $ search_this e retorna verdadeiro ou falso. alguma ideia por favor?

Peter
fonte
@VishalKumarSahu Não exatamente uma duplicata: o link fornecido tem a ver com a verificação se QUALQUER elemento está contido em outro array, não se TODOS os elementos estão contidos em outro.
Stefan de

Respostas:

159

Olhe para array_intersect () .

$containsSearch = count(array_intersect($search_this, $all)) == count($search_this);
Jasonbar
fonte
11
Você sabe que pode omitir as duas count()chamadas?
Wrikken
1
@Wrikken Os valores não podem ser reordenados durante array_intersect()? Quero dizer ['a', 'b'] != ['b', 'a'],.
sbichenko,
4
E mesmo assim: comparação de matriz : " ==VERDADEIRO se $ a e $ b têm os mesmos pares chave / valor." , então a ordem nem importa (use ===para isso)
Wrikken
2
Esta resposta assume que o array $ all contém apenas valores únicos. Se este não for o caso, pode-se usar a função array_unique no array $ all na função array_intersects.
Relequestual
5
a solução array_diff que @orrd deu é muito mais limpa
Joseph Connolly,
222

Todas as respostas anteriores estão fazendo mais trabalho do que precisam. Basta usar array_diff . Esta é a maneira mais simples de fazer isso:

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

Isso é tudo que você precisa fazer.

orrd
fonte
4
Obrigado pelo momento aha; Eu entrei pensando array_intersect.
Derek Illchuk
19
esta deve ser a resposta
Mateus,
2
Sim, é uma solução muito melhor
Oleksandr Diudiun
1
Melhor solução do que cruzar!
TheBosti
1
Encontrei esta página e usei a solução acima porque ela representava duplicatas
Rayzor
9

Um pouco mais curto com 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
fonte
3

Acho que você está procurando a função de interseção

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

array_intersect()retorna um array contendo todos os valores de array1 que estão presentes em todos os argumentos. Observe que as chaves são preservadas.

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

James Kyburz
fonte
0

Que tal agora:

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

    return count(array_intersect($searchForKeys, $searchableArrayKeys)) == count($searchForKeys); 
}
K-Alex
fonte