in_array mehrere Werte

110

Wie überprüfe ich, ob mehrere Werte vorhanden sind, z.

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

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

Das ist ein Beispiel, damit Sie es ein bisschen besser verstehen. Ich weiß, dass es nicht funktionieren wird.

Daryl
quelle

Antworten:

200

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
 }
Mark Elliot
quelle
13
Diese Lösung ist nicht die beste: $ Needles = Array (1,2); $ haystack = array (1,1,2,3); return (count (array_intersect ($ heuhaufen, $ nadeln)) == count ($ nadeln)); dies wird falsch zurückgeben, das ist nicht gut. Die Lösung von Rok Kralj ist für diesen Fall gut.
Ihtus
1
Ich denke, dieses Array sollte eindeutige Daten enthalten, sonst funktioniert diese Lösung nicht
Hashan Kanchana
182

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.

Überprüfen Sie, ob ALLE Nadeln vorhanden sind

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

Überprüfen Sie, ob eine der Nadeln vorhanden ist

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
quelle
8
Hinweis: Diese Art der Array-Deklaration ist> = PHP 5.4
Claudiu Hojda
Hervorragende Lösung, vorausgesetzt, Sie müssen keinen strengen Vergleich durchführen.
Ohnmachtssignal
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
quelle
7

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

https://glot.io/snippets/f7dhw4kmju

sMyles
quelle
9
Dies wäre als Kommentar zu Roks Antwort nützlicher als als neue Antwort.
Ohnmachtssignal
@ Jaymin wie so (Sie haben NULL Details angegeben) ... funktioniert perfekt für mich glot.io/snippets/f7dhw4kmju
sMyles
@sMyles Ich hatte versucht, einen String-Wert im Array anstelle einer Ganzzahl zu verwenden. Sie können es einmal von Ihrer Seite versuchen und mich wissen lassen.
Jaymin
@ Jaymin haben immer noch nicht das Problem glot.io/snippets/f7dhw4kmju
sMyles
Diese Bool- Konvertierung ist hier nicht geeignet, da array_intersect ein Array zurückgibt, das leer oder nicht leer sein kann. @ rok-kralj Lösung ist die einzig bevorzugte.
Codelearner
3

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!

Maraspin
quelle
Ich habe geändert, wie ich alles bereits gemacht habe, so dass ich es in der endgültigen Ausgabe nicht so oder so machen musste, obwohl es immer gut zu lernen ist, danke für deine Eingabe und deine Zeit!
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 () 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.

Umesh Patil
quelle