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.

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
 }

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

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
}

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


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!


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.