151 votes

in_array plusieurs valeurs

Comment puis-je vérifier plusieurs valeurs, telles que :

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

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

C'est un exemple pour que vous compreniez un peu mieux, je sais que ça ne marchera pas.

247voto

Mark Elliot Points 31871

Croisez les cibles avec la botte de foin et assurez-vous que l'intersection est exactement égale aux cibles :

 $haystack = array(...);

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

if(count(array_intersect($haystack, $target)) == count($target)){
    // all of $target is in $haystack
}

Notez qu'il vous suffit de vérifier que la taille de l'intersection résultante est de la même taille que le tableau de valeurs cibles pour dire que $haystack est un sur-ensemble de $target .

Pour vérifier qu'au moins une valeur dans $target est également dans $haystack , vous pouvez effectuer cette vérification :

  if(count(array_intersect($haystack, $target)) > 0){
     // at least one of $target is in $haystack
 }

236voto

Rok Kralj Points 11593

En tant que développeur, vous devriez probablement commencer à apprendre les opérations sur les ensembles (différence, union, intersection). Vous pouvez imaginer votre tableau comme un "ensemble" et les clés que vous recherchez l'autre.

Vérifiez si TOUTES les aiguilles existent

 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

Vérifiez si l'UNE des aiguilles existe

 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

19voto

RiaD Points 15744
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
}

9voto

sMyles Points 851

En sortant de la réponse de @Rok Kralj (meilleure OMI) pour vérifier si des aiguilles existent dans la botte de foin, vous pouvez utiliser (bool) au lieu de !! ce qui peut parfois être déroutant lors de la révision du code.

 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

3voto

maraspin Points 1485

IMHO La meilleure solution de Mark Elliot pour ce problème. Si vous devez effectuer des opérations de comparaison plus complexes entre des éléments de tableau ET que vous utilisez PHP 5.3, vous pouvez également penser à quelque chose comme ce qui suit :

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

Cela repose sur une fermeture; la fonction de comparaison peut devenir beaucoup plus puissante. Bonne chance!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X