Respuestas:
Interseccione los objetivos con el pajar y asegúrese de que la intersección sea exactamente igual a los objetivos:
$haystack = array(...);
$target = array('foo', 'bar');
if(count(array_intersect($haystack, $target)) == count($target)){
// all of $target is in $haystack
}
Tenga en cuenta que solo necesita verificar que el tamaño de la intersección resultante sea del mismo tamaño que la matriz de valores objetivo para decir que $haystack
es un superconjunto de $target
.
Para verificar que al menos un valor en $target
también está adentro $haystack
, puede hacer esta verificación:
if(count(array_intersect($haystack, $target)) > 0){
// at least one of $target is in $haystack
}
Como desarrollador, probablemente debería comenzar a aprender las operaciones de conjuntos (diferencia, unión, intersección). Puede imaginar su matriz como un "conjunto" y las claves que está buscando para el otro.
function in_array_all($needles, $haystack) {
return empty(array_diff($needles, $haystack));
}
echo in_array_all( [3,2,5], [5,8,3,1,2] ); // true, all 3, 2, 5 present
echo in_array_all( [3,2,5,9], [5,8,3,1,2] ); // false, since 9 is not present
function in_array_any($needles, $haystack) {
return !empty(array_intersect($needles, $haystack));
}
echo in_array_any( [3,9], [5,8,3,1,2] ); // true, since 3 is present
echo in_array_any( [4,9], [5,8,3,1,2] ); // false, neither 4 nor 9 is present
Salir de la respuesta de @Rok Kralj (mejor en mi opinión) para verificar si existe alguna de las agujas en el pajar, puede usar en (bool)
lugar de lo !!
que a veces puede ser confuso durante la revisión del código.
function in_array_any($needles, $haystack) {
return (bool)array_intersect($needles, $haystack);
}
echo in_array_any( array(3,9), array(5,8,3,1,2) ); // true, since 3 is present
echo in_array_any( array(4,9), array(5,8,3,1,2) ); // false, neither 4 nor 9 is present
En mi humilde opinión, la solución de Mark Elliot es la mejor para este problema. Si necesita realizar operaciones de comparación más complejas entre elementos de la matriz Y está en PHP 5.3, también puede pensar en algo como lo siguiente:
<?php
// First Array To Compare
$a1 = array('foo','bar','c');
// Target Array
$b1 = array('foo','bar');
// Evaluation Function - we pass guard and target array
$b=true;
$test = function($x) use (&$b, $b1) {
if (!in_array($x,$b1)) {
$b=false;
}
};
// Actual Test on array (can be repeated with others, but guard
// needs to be initialized again, due to by reference assignment above)
array_walk($a1, $test);
var_dump($b);
Esto se basa en un cierre; La función de comparación puede volverse mucho más poderosa. ¡Buena suerte!
if(empty(array_intersect([21,22,23,24], $check_with_this)) {
print "Not found even a single element";
} else {
print "Found an element";
}
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.
Devuelve una matriz que contiene todos los valores de matriz1 cuyos valores existen en todos los parámetros.
vacío (): determina si una variable está vacía
Devuelve FALSE si var existe y tiene un valor distinto de cero y no vacío. De lo contrario, devuelve TRUE.