in_array múltiples valores

110

¿Cómo verifico varios valores, como:

$arg = array('foo','bar');

if(in_array('foo','bar',$arg))

Ese es un ejemplo para que lo entiendas un poco mejor, sé que no funcionará.

daryl
fuente

Respuestas:

200

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 $haystackes un superconjunto de $target.

Para verificar que al menos un valor en $targettambién está adentro $haystack, puede hacer esta verificación:

 if(count(array_intersect($haystack, $target)) > 0){
     // at least one of $target is in $haystack
 }
Mark Elliot
fuente
13
esta solución no es la mejor: $ needles = array (1,2); $ pajar = matriz (1,1,2,3); return (contar (array_intersect ($ pajar, $ agujas)) == contar ($ agujas)); esto devolverá falso, eso no es bueno. La solución de Rok Kralj es buena para este caso.
ihtus
1
Creo que esa matriz debe contener datos únicos y, de lo contrario, esta solución no funcionará
Hashan Kanchana
182

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.

Compruebe si existen TODAS las agujas

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

Compruebe si existe ALGUNA de las agujas

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
Rok Kralj
fuente
9
Nota: este tipo de declaración de matriz es> = PHP 5.4
Claudiu Hojda
Excelente solución siempre que no necesite realizar una comparación estricta.
señal de desmayo
14
if(in_array('foo',$arg) && in_array('bar',$arg)){
    //both of them are in $arg
}

if(in_array('foo',$arg) || in_array('bar',$arg)){
    //at least one of them are in $arg
}
RiaD
fuente
7

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

https://glot.io/snippets/f7dhw4kmju

sMyles
fuente
9
Esto sería más útil como comentario sobre la respuesta de Rok que como una nueva respuesta.
señal de desmayo
@Jaymin cómo es (proporcionaste CERO detalles) ... funciona perfectamente bien para mí glot.io/snippets/f7dhw4kmju
sMyles
@sMyles Intenté usar un valor de cadena en una matriz en lugar de un entero. Puedes intentarlo una vez desde tu lado y avisarme.
Jaymin
@Jaymin todavía no tiene ese problema glot.io/snippets/f7dhw4kmju
sMyles
Esta conversión bool no es adecuada aquí ya que array_intersect devuelve una matriz que puede estar vacía o no vacía. La solución @ rok-kralj es la única preferida.
codelearner
3

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!

maraspin
fuente
Ya cambié la forma en que hice todo, así que en el resultado final no tuve que hacerlo de ninguna manera, aunque siempre es bueno aprender, ¡gracias por tu aporte y tu tiempo!
daryl
2
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.

Umesh Patil
fuente