Die Rückruffunktion in array_filter()
übergibt nur die Werte des Arrays, nicht die Schlüssel.
Wenn ich habe:
$my_array = array("foo" => 1, "hello" => "world");
$allowed = array("foo", "bar");
Was ist der beste Weg, um alle Schlüssel zu löschen $my_array
, die sich nicht im $allowed
Array befinden?
Gewünschte Ausgabe:
$my_array = array("foo" => 1);
$b = ['foo' => $a['foo'], 'bar' => $a['bar']]
Dies wird zur Folge haben$b['bar']
seinull
.Antworten:
PHP 5.6 eingeführt einen dritten Parameter
array_filter()
,flag
, dass Sie einstellen können ,ARRAY_FILTER_USE_KEY
um Filter mit Schlüssel statt Wert:Dies ist
array_intersect_key($my_array, array_flip($allowed))
natürlich nicht so elegant wie , bietet jedoch die zusätzliche Flexibilität, einen beliebigen Test für den Schlüssel durchzuführen, z. B.$allowed
könnte Regex-Muster anstelle von einfachen Zeichenfolgen enthalten.Sie können auch
ARRAY_FILTER_USE_BOTH
den Wert und den Schlüssel an Ihre Filterfunktion übergeben lassen. Hier ist ein erfundenes Beispiel, das auf dem ersten basiert, aber beachten Sie, dass ich nicht empfehlen würde, Filterregeln auf$allowed
diese Weise zu codieren :quelle
array_intersect
Mit
array_intersect_key
undarray_flip
:quelle
array_flip
? Definieren Sie einfach die$allowed
mit Tasten:allowed = array ( 'foo' => 1, 'bar' => 1 );
Ich musste dasselbe tun, aber mit einem komplexeren
array_filter
Schlüssel.Hier ist, wie ich es gemacht habe, mit einer ähnlichen Methode.
Dies gibt das Ergebnis aus:
quelle
Hier ist eine flexiblere Lösung mit einem Verschluss:
Ausgänge:
In der Funktion können Sie also andere spezifische Tests durchführen.
quelle
Wenn Sie nach einer Methode suchen, um ein Array nach einer in Schlüsseln vorkommenden Zeichenfolge zu filtern, können Sie Folgendes verwenden:
Das Ergebnis von
print_r($mResult)
istEine Anpassung dieser Antwort, die reguläre Ausdrücke unterstützt
Ausgabe
quelle
stristr
innerhalb der "Arbeit" der Funktion einige Annahmen für den Endbenutzer macht. Vielleicht wäre es besser, dem Benutzer zu erlauben, einen regulären Ausdruck einzugeben; Dies würde ihnen mehr Flexibilität in Bezug auf bestimmte Dinge wie Anker, Wortgrenzen und Groß- und Kleinschreibung usw. gebenSo erhalten Sie den aktuellen Schlüssel eines Arrays bei Verwendung
array_filter
Unabhängig davon, wie ich Vincents Lösung für Mačeks Problem mag, wird sie nicht wirklich verwendet
array_filter
. Wenn Sie von einer Suchmaschine hierher gekommen sind, haben Sie vielleicht nach so etwas gesucht ( PHP> = 5.3 ):Es übergibt das Array, das Sie filtern, als Referenz auf den Rückruf. Da
array_filter
das Array herkömmlicherweise nicht durch Erhöhen des öffentlichen internen Zeigers durchlaufen wird, müssen Sie es selbst weiterentwickeln.Wichtig ist hierbei, dass Sie sicherstellen müssen, dass Ihr Array zurückgesetzt wird, da Sie sonst möglicherweise genau in der Mitte beginnen.
In PHP> = 5.4 können Sie den Rückruf noch kürzer machen:
quelle
Hier ist eine weniger flexible Alternative mit unset () :
Das Ergebnis des
print_r($array)
Seins:Dies gilt nicht, wenn Sie die gefilterten Werte für die spätere Verwendung aufbewahren möchten, aber aufgeräumter, wenn Sie sicher sind, dass dies nicht der Fall ist .
quelle
unset()
. Es werden keine Warnungen ausgegeben, wenn der Schlüssel nicht vorhanden ist.Ab PHP 5.6 können Sie das
ARRAY_FILTER_USE_KEY
Flag verwenden inarray_filter
:Andernfalls können Sie diese Funktion ( von TestDummy ) verwenden:
Und hier ist eine erweiterte Version von mir, die einen Rückruf oder direkt die Schlüssel akzeptiert:
Zu guter Letzt können Sie auch ein einfaches verwenden
foreach
:quelle
Vielleicht ein Overkill, wenn Sie es nur einmal brauchen, aber Sie können die YaLinqo- Bibliothek * verwenden, um Sammlungen zu filtern (und andere Transformationen durchzuführen). Diese Bibliothek ermöglicht die Durchführung von SQL-ähnlichen Abfragen für Objekte mit fließender Syntax. Seine
where
Funktion akzeptiert einen Calback mit zwei Argumenten: einem Wert und einem Schlüssel. Zum Beispiel:(Die
where
Funktion gibt einen Iterator zurück. Wenn Sie also nurforeach
einmal mit der resultierenden Sequenz iterieren müssen ,->toArray()
kann diese entfernt werden.)* von mir entwickelt
quelle
Array Filter Funktion von PHP:
$ array - Dies ist das Eingabearray
$ callback_function - Die zu verwendende Rückruffunktion , Wenn die Rückruffunktion true zurückgibt , wird der aktuelle Wert aus dem Array in das Ergebnisarray zurückgegeben.
$ flag - Dies ist ein optionaler Parameter , der bestimmt, welche Argumente an die Rückruffunktion gesendet werden. Wenn dieser Parameter leer ist, verwendet die Rückruffunktion Array-Werte als Argument. Wenn Sie einen Array-Schlüssel als Argument senden möchten, verwenden Sie $ flag als ARRAY_FILTER_USE_KEY . Wenn Sie sowohl Schlüssel als auch Werte senden möchten, sollten Sie $ flag als ARRAY_FILTER_USE_BOTH verwenden .
Zum Beispiel: Betrachten Sie ein einfaches Array
Wenn Sie ein Array basierend auf dem Array-Schlüssel filtern möchten , müssen Sie ARRAY_FILTER_USE_KEY als dritten Parameter der Array-Funktion array_filter verwenden.
Wenn Sie das Array basierend auf dem Array-Schlüssel und dem Array-Wert filtern möchten , müssen Sie ARRAY_FILTER_USE_BOTH als dritten Parameter der Array-Funktion array_filter verwenden.
Beispiel für Rückruffunktionen:
Es wird ausgegeben
quelle
Mit dieser Funktion können Sie ein mehrdimensionales Array filtern
quelle
quelle
Naive und hässliche (scheint aber schneller zu sein) Lösung?
Ich habe dies nur in PHP 7.3.11 versucht, aber eine hässliche Schleife scheint in etwa einem Drittel der Zeit ausgeführt zu werden. Ähnliche Ergebnisse auf einem Array mit einigen hundert Schlüsseln. Mikrooptimierung, wahrscheinlich nicht nützlich in RW, fand sie aber überraschend und interessant:
quelle
quelle