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.
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.
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
}
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.
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
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
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 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.