Antworten:
Schneiden Sie die Ziele mit dem Heuhaufen und stellen Sie sicher, dass der Schnittpunkt genau den Zielen entspricht:
$haystack = array(...);
$target = array('foo', 'bar');
if(count(array_intersect($haystack, $target)) == count($target)){
// all of $target is in $haystack
}
Beachten Sie, dass Sie nur überprüfen müssen, ob die Größe des resultierenden Schnittpunkts der Größe des Arrays von Zielwerten entspricht, um zu sagen, dass $haystackes sich um eine Obermenge von handelt$target .
Um zu überprüfen, ob mindestens ein Wert in auch vorhanden $targetist $haystack, können Sie Folgendes überprüfen:
if(count(array_intersect($haystack, $target)) > 0){
// at least one of $target is in $haystack
}
Als Entwickler sollten Sie wahrscheinlich mit dem Erlernen von Mengenoperationen (Differenz, Vereinigung, Schnittmenge) beginnen. Sie können sich Ihr Array als einen "Satz" und die Schlüssel vorstellen, nach denen Sie suchen.
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
Wenn Sie die Antwort von @Rok Kralj (beste IMO) deaktivieren, um zu überprüfen, ob Nadeln im Heuhaufen vorhanden sind, können Sie (bool)stattdessen verwenden, !!was bei der Codeüberprüfung manchmal verwirrend sein kann.
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 Mark Elliots beste Lösung für dieses Problem. Wenn Sie komplexere Vergleichsoperationen zwischen Array-Elementen durchführen müssen UND PHP 5.3 verwenden, können Sie auch an Folgendes denken:
<?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);
Dies beruht auf einer Schließung; Die Vergleichsfunktion kann viel leistungsfähiger werden. Viel Glück!
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 () gibt ein Array zurück, das alle Werte von array1 enthält, die in allen Argumenten vorhanden sind. Beachten Sie, dass die Schlüssel erhalten bleiben.
Gibt ein Array zurück, das alle Werte in Array1 enthält, deren Werte in allen Parametern vorhanden sind.
leer () - Bestimmen Sie, ob eine Variable leer ist
Gibt FALSE zurück, wenn var vorhanden ist und einen nicht leeren Wert ungleich Null hat. Andernfalls wird TRUE zurückgegeben.