php comprueba si la matriz contiene todos los valores de la matriz de otra matriz

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

Me gustaría saber si $ all contiene todos los valores de $ search_this y devolver verdadero o falso. alguna idea por favor?

pedro
fuente
@VishalKumarSahu No es un duplicado: su enlace dado tiene que ver con verificar si CUALQUIER elemento está contenido en otra matriz, no si TODOS los elementos están contenidos en otra.
Stefan

Respuestas:

159

Mira array_intersect () .

$containsSearch = count(array_intersect($search_this, $all)) == count($search_this);
Jasonbar
fuente
11
¿Sabes que puedes omitir ambas count()llamadas?
Wrikken
1
@Wrikken ¿No se pueden reordenar los valores durante array_intersect()? Es decir, ['a', 'b'] != ['b', 'a'].
sbichenko
4
E incluso entonces: comparación de matrices : " ==VERDADERO si $ ay $ b tienen los mismos pares clave / valor". , por lo que el orden ni siquiera importa ( ===
úselo
2
Esta respuesta asume que la matriz $ all solo contiene valores únicos. Si este no es el caso, se puede usar la función array_unique en la matriz $ all en la función array_intersects.
Relequestual
5
La solución array_diff que @orrd dio es mucho más limpia
Joseph Connolly
223

Todas las respuestas anteriores están haciendo más trabajo del necesario. Simplemente use array_diff . Esta es la forma más sencilla de hacerlo:

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

Eso es todo lo que tienes que hacer.

orden
fuente
4
Gracias por el momento aha; Entré pensando array_intersect.
Derek Illchuk
19
esta debería ser la respuesta
Mateo
2
Sí, es una solución tan mejor
Oleksandr Diudiun
1
¡Mejor solución que intersecar!
TheBosti
1
Encontré esta página y utilicé la solución anterior porque tenía duplicados
Rayzor
9

Un poco más corto con 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
fuente
3

Creo que estás buscando la función de intersección.

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

array_intersect()devuelve una matriz que contiene todos los valores de matriz1 que están presentes en todos los argumentos. Tenga en cuenta que las claves se conservan.

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

James Kyburz
fuente
0

Qué tal esto:

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

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