in_array plusieurs valeurs

110

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 cela ne fonctionnera pas.

daryl
la source

Réponses:

200

Intersectez 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 la même que celle du tableau de valeurs cibles pour dire qu'il $haystacks'agit d'un sur-ensemble de $target.

Pour vérifier qu'au moins une valeur de $targetest également présente $haystack, vous pouvez effectuer cette vérification:

 if(count(array_intersect($haystack, $target)) > 0){
     // at least one of $target is in $haystack
 }
Mark Elliot
la source
13
cette solution n'est pas la meilleure: $ aiguilles = array (1,2); $ botte de foin = tableau (1,1,2,3); return (count (array_intersect ($ meule de foin, $ aiguilles)) == count ($ aiguilles)); cela retournera faux, ce n'est pas bon. La solution de Rok Kralj est bonne pour ce cas.
ihtus le
1
Je pense que ces tableaux devraient contenir des données uniques et sinon cette solution ne fonctionnera pas
Hashan Kanchana
182

En tant que développeur, vous devriez probablement commencer à apprendre les opérations d'ensemble (différence, union, intersection). Vous pouvez imaginer votre tableau comme un "ensemble" et les clés que vous recherchez pour 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
Rok Kralj
la source
9
Remarque: ce type de déclaration de tableau est> = PHP 5.4
Claudiu Hojda
Excellente solution à condition que vous n'ayez pas besoin d'effectuer une comparaison stricte.
faintsignal
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
la source
7

En partant de la réponse @Rok Kralj (meilleure IMO) pour vérifier si des aiguilles existent dans la botte de foin, vous pouvez utiliser à la (bool)place de celles- !!ci pouvant parfois être déroutantes 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

sMyles
la source
9
Ce serait plus utile comme commentaire sur la réponse de Rok que comme nouvelle réponse.
faintsignal
@Jaymin comment donc (vous avez fourni ZERO détails) ... fonctionne parfaitement bien pour moi glot.io/snippets/f7dhw4kmju
sMyles
@sMyles J'avais essayé d'utiliser une valeur de chaîne dans un tableau au lieu d'un entier. Vous pouvez essayer une fois de votre côté et faites le moi savoir.
Jaymin
@Jaymin n'a toujours pas ce problème glot.io/snippets/f7dhw4kmju
sMyles
Cette bool conversion ne convient pas ici car array_intersect retourne un tableau qui peut être vide ou non vide. La solution @ rok-kralj est la seule préférée.
codelearner
3

La meilleure solution de IMHO Mark Elliot pour ce problème. Si vous avez besoin de faire des opérations de comparaison plus complexes entre les éléments du tableau ET que vous êtes sur PHP 5.3, vous pouvez également penser à quelque chose comme ceci:

<?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!

maraspin
la source
J'ai déjà changé la façon dont je faisais tout, donc dans la sortie finale, je n'ai pas eu besoin de le faire de toute façon, même si c'est toujours bon à apprendre, merci pour votre contribution et votre temps!
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 () renvoie un tableau contenant toutes les valeurs de array1 présentes dans tous les arguments. Notez que les clés sont conservées.

Renvoie un tableau contenant toutes les valeurs de array1 dont les valeurs existent dans tous les paramètres.


empty () - Détermine si une variable est vide

Renvoie FALSE si var existe et a une valeur non vide et non nulle. Sinon, retourne TRUE.

Umesh Patil
la source