Ich habe eine Vielzahl von Arrays, die entweder enthalten
story & message
oder nur
story
Wie würde ich überprüfen, ob ein Array sowohl eine Story als auch eine Nachricht enthält? array_key_exists()
sucht nur nach diesem einzelnen Schlüssel im Array.
Gibt es eine Möglichkeit, dies zu tun?
array_intersect_key()
Vergleichen Sie ein Array der Schlüssel, die Sie überprüfen möchten, mit dem Array, das Sie überprüfen. Wenn die Länge der Ausgabe mit der Anzahl der zu überprüfenden Schlüssel übereinstimmt, sind alle vorhanden.["story & message" => "value"]
oder ist es eher wie["story & message"]
Antworten:
Wenn Sie nur 2 Schlüssel überprüfen müssen (wie in der ursprünglichen Frage), ist es wahrscheinlich einfach genug, nur
array_key_exists()
zweimal anzurufen , um zu überprüfen, ob die Schlüssel vorhanden sind.Dies lässt sich jedoch offensichtlich nicht gut auf viele Tasten skalieren. In dieser Situation würde eine benutzerdefinierte Funktion helfen.
quelle
$keys
enthält , das nicht in$arr
und ein anderes, das darin ist,!array_diff_key
leer zurückgibt =>false
( 3v4l Beispiel ) ...!array_diff($keys, array_keys($array));
da die Ausarbeitung dieserarray_flip
s etwas weniger kognitiv ist .Hier ist eine Lösung, die skalierbar ist, auch wenn Sie nach einer großen Anzahl von Schlüsseln suchen möchten:
quelle
Überraschenderweise
array_keys_exist
gibt es nicht?! In der Zwischenzeit bleibt etwas Platz, um einen einzeiligen Ausdruck für diese allgemeine Aufgabe zu finden. Ich denke an ein Shell-Skript oder ein anderes kleines Programm.Hinweis: Jede der folgenden Lösungen verwendet eine
[…]
präzise Array-Deklarationssyntax, die in PHP 5.4+ verfügbar istarray_diff + array_keys
(Hutspitze zu Kim Stacks )
Dieser Ansatz ist der kurzeste, den ich gefunden habe.
array_diff()
Gibt ein Array von Elementen zurück, die in Argument 1 vorhanden sind und in Argument2 nicht vorhanden sind. Daher zeigt ein leeres Array an, dass alle Schlüssel gefunden wurden. In PHP 5.5 könnten Sie vereinfachen0 === count(…)
, um einfach zu seinempty(…)
.array_reduce + ungesetzt
Schwer zu lesen, leicht zu ändern.
array_reduce()
verwendet einen Rückruf, um über ein Array zu iterieren und einen Wert zu erhalten. Wenn wir die Schlüssel eingeben, deren$initial
Wert uns interessiert,$in
und dann die in der Quelle gefundenen Schlüssel entfernen, können wir davon ausgehen, dass sie mit 0 Elementen enden, wenn alle Schlüssel gefunden wurden.Die Konstruktion ist leicht zu ändern, da die Schlüssel, an denen wir interessiert sind, gut in das Endergebnis passen.
array_filter & in_array
Einfacher zu schreiben als die
array_reduce
Lösung, aber etwas schwieriger zu bearbeiten.array_filter
ist auch ein iterativer Rückruf, mit dem Sie ein gefiltertes Array erstellen können, indem Sie im Rückruf true (Element in neues Array kopieren) oder false (nicht kopieren) zurückgeben. Das Problem ist, dass Sie2
die Anzahl der erwarteten Elemente ändern müssen .Dies kann haltbarer gemacht werden, steht aber kurz vor der absurden Lesbarkeit:
quelle
Es scheint mir, dass die mit Abstand einfachste Methode folgende wäre:
Drucke:
Auf diese Weise können Sie auch überprüfen, welche Schlüssel genau fehlen. Dies kann für die Fehlerbehandlung hilfreich sein.
quelle
Eine weitere mögliche Lösung:
quelle
Die oben genannten Lösungen sind clever, aber sehr langsam. Eine einfache foreach-Schleife mit isset ist mehr als doppelt so schnell wie die
array_intersect_key
Lösung.(344 ms gegenüber 768 ms für 1000000 Iterationen)
quelle
false
(false
überschreibttrue
in diesem Fall). Also, was für meine Bedürfnisse funktioniert, ist, dassforeach ($keys as $key) { if (array_key_exists($key, $array)) { return true; }} return false;
meine Bedürfnisse waren, wenn derany
Schlüssel in einem Array in einem anderen Array vorhanden ist ...Was ist damit:
Geben Sie nur true zurück, wenn beide nicht null sind
Wenn null ist, befindet sich der Schlüssel nicht im Array
quelle
$arr['key1']
oder$arr['key2']
istnull
, der Code wird, ist der Schlüssel noch vorhanden.foreach
Schleife?isset
Funktion so funktioniert, wie ich es gemeint habe, aber jetzt merke ich, dass Sie Recht hatten, die Schlüssel immer noch in einem Array verbleiben und meine Antwort daher nicht korrekt ist. Vielen Dank für Ihr Feedback. Ja, ich könnte es benutzenforeach
.Ich benutze so etwas ziemlich oft
oder um die Werte für die gewünschten Schlüssel zu finden
quelle
Wenn Sie so etwas haben:
Sie könnten einfach
count()
:Dies funktioniert nur, wenn Sie sicher sind, dass Sie NUR diese Array-Schlüssel haben und sonst nichts.
Die Verwendung von array_key_exists () unterstützt jeweils nur die Überprüfung eines Schlüssels. Sie müssen daher beide separat überprüfen:
array_key_exists()
Gibt true zurück, wenn der Schlüssel im Array vorhanden ist, aber es ist eine echte Funktion und viel zu tippen. Das Sprachkonstrukt machtisset()
fast dasselbe, außer wenn der getestete Wert NULL ist:Darüber hinaus können mit isset mehrere Variablen gleichzeitig überprüft werden:
Um den Test für festgelegte Inhalte zu optimieren, sollten Sie dieses "Wenn" verwenden:
quelle
Versuche dies
quelle
Dies ist die Funktion, die ich für mich selbst geschrieben habe, um sie innerhalb einer Klasse zu verwenden.
Ich gehe davon aus, dass Sie in einem Array nach mehreren Schlüsseln suchen müssen, die ALLE EXISTIEREN. Wenn Sie nach einer Übereinstimmung mit mindestens einem Schlüssel suchen, lassen Sie es mich wissen, damit ich eine andere Funktion bereitstellen kann.
Codepad hier http://codepad.viper-7.com/AKVPCH
quelle
if (0 === count(array_diff(['key1','key2','key3'], array_keys($lookIn)))) { // all keys exist } else { // nope }
Hoffe das hilft:
quelle
Das ist alt und wird wahrscheinlich begraben werden, aber das ist mein Versuch.
Ich hatte ein ähnliches Problem wie @Ryan. In einigen Fällen musste ich nur überprüfen, ob sich mindestens 1 Schlüssel in einem Array befand, und in einigen Fällen wurde alles benötigt anwesend sein.
Also habe ich diese Funktion geschrieben:
Dies war viel einfacher, als mehrere
||
und&&
Blöcke schreiben zu müssen .quelle
Funktioniert das nicht
quelle
// Demo ausführen
quelle
Ich bin nicht sicher, ob es eine schlechte Idee ist, aber ich benutze eine sehr einfache foreach-Schleife, um mehrere Array-Schlüssel zu überprüfen.
quelle
quelle
Gibt true zurück, da in $ myArray Schlüssel aus dem Array $ keys enthalten sind
quelle
So etwas könnte benutzt werden
Aktualisierung
In einer Fettfunktion :
Also zum Beispiel damit:
Hoffe das hilft :)
quelle
Normalerweise benutze ich eine Funktion, um meinen Beitrag zu validieren, und sie ist auch eine Antwort auf diese Frage. Lassen Sie mich sie also posten.
Um meine Funktion aufzurufen, verwende ich das 2-Array wie folgt
dann wird meine Funktion so aussehen
Dies wird dies ausgeben
"erforderlich": ["Benutzername", "Passwort", "jedes andere Feld"]
Diese Funktion überprüft also alle fehlenden Felder der Post-Anfrage und gibt sie zurück.
quelle