Ich habe eine Reihe von Katzenobjekten:
$cats = Array
(
[0] => stdClass Object
(
[id] => 15
),
[1] => stdClass Object
(
[id] => 18
),
[2] => stdClass Object
(
[id] => 23
)
)
und ich möchte ein Array von Katzen-IDs in einer Zeile extrahieren (weder eine Funktion noch eine Schleife).
Ich habe darüber nachgedacht, array_walk
mit zu verwenden, create_function
aber ich weiß nicht, wie ich es machen soll.
Irgendeine Idee?
Antworten:
Wenn Sie PHP 5.5 oder höher haben , verwenden Sie am besten die integrierte Funktion
array_column()
:Aber der Sohn muss ein Array sein oder in ein Array konvertiert werden
quelle
array_column
überhaupt nicht mit einemarray
vonobject
s funktioniert . Da PHP 7.0.0 möglich ist: stackoverflow.com/a/23335938/655224Sie können die
array_map()
Funktion verwenden.Dies sollte es tun:
quelle
$project_names = array_map(function($project) { return $project->name ;}, $projects );
In diesem Blog-Beitrag wird jedoch darauf hingewiesen, dass es auf diese Weise 2,5-mal langsamer / speicherintensiv sein kann.create_function
dem Speicher erstellt wird, erwachsen wird. Wenn Sie ein Programm mit Endlosschleifen schreiben und dasarray_map
withcreate_function
darin aufrufen , wird irgendwann immer eineOut of memory...
Fehlermeldung angezeigt. Also nicht benutzencreate_function
und benutzenarray_map(function($o) { return $o->id; }, $objects);
Die Lösung hängt von der verwendeten PHP-Version ab. Zumindest gibt es 2 Lösungen:
Erstens (neuere PHP-Versionen)
Wie @JosepAlsina zuvor sagte, besteht die beste und auch kürzeste Lösung darin,
array_column
Folgendes zu verwenden:Hinweis: Zum Iterieren eines in der Frage verwendeten
array
enthaltenden\stdClass
ES ist dies nur mit PHP-Versionen möglich>= 7.0
. Aber wenn Sie einarray
enthaltendesarray
s verwenden, können Sie dasselbe seit PHP tun>= 5.5
.Zweitens (ältere PHP-Versionen)
@ Greg sagte, in älteren PHP-Versionen sei Folgendes möglich:
Aber Vorsicht: In neueren PHP-Versionen ist
>= 5.3.0
es besser,Closure
s zu verwenden , wie folgt:Der Unterschied
Die erste Lösung erstellt eine neue Funktion und legt sie in Ihrem RAM ab. Der Garbage Collector löscht die bereits erstellte und bereits aufgerufene Funktionsinstanz aus irgendeinem Grund nicht aus dem Speicher. Und das unabhängig davon, dass die erstellte Funktionsinstanz nie wieder aufgerufen werden kann, weil wir keinen Zeiger dafür haben. Und wenn dieser Code das nächste Mal aufgerufen wird, wird dieselbe Funktion erneut erstellt. Dieses Verhalten füllt langsam Ihr Gedächtnis ...
Beide Beispiele mit Speicherausgabe zum Vergleich:
SCHLECHT
GUT
Dies kann auch hier diskutiert werden
Speicherleck?! Funktioniert Garbage Collector richtig, wenn 'create_function' in 'array_map' verwendet wird?
quelle
array_column
dieses Array zu verwenden, wird immer ein Leerzeichen zurückgegeben, während DIESES Snippet ordnungsgemäß funktioniert. Beide haben die geschützte Eigenschaft, auf die im zweiten Snippet zugegriffen werden kann nur. Ich konnte keinen anderen Grund als den Namespace finden.object
in meine Lösung schreibe, meine ichobject
keineObject
. Das Kleinbuchstabenobject
beschreibt das einfache Objekt\stdClass
. Vielleicht ist das das Problem. Hat duObject
einetoArray
Methode? Benutze das. Ein einfachesobject
und einarray
ist fast das gleiche. Folgende Invariante muss gültig sein :((object)(array)$o) === $o
. Bei der Implementierung der__get
Methode machen Sie Ihre Klasseneigenschaften für alle zugänglich. Dies kann das erwartete Verhalten sein. Sie können aber auch über Ihrarray<Object>
zB mitarray_map
und AnruftoArray
(falls vorhanden) iterieren und dann funktioniert auch ITund benutze es in einer Zeile :
quelle
array_walk
.CODE
AUSGABE
Ich weiß, dass es eine Schleife verwendet, aber es ist der einfachste Weg, dies zu tun! Und mit einer Funktion endet es immer noch in einer einzelnen Zeile.
quelle
Sie können es leicht mit Ouzo Goodies tun
oder mit Arrays (von Ouzo Goodies)
Überprüfen Sie heraus: http://ouzo.readthedocs.org/en/latest/utils/functions.html#extract
Siehe auch Funktionsprogrammierung mit Ouzo (ich kann keinen Link posten).
quelle
Eingebaute Schleifen in PHP sind schneller als interpretierte Schleifen, daher ist es tatsächlich sinnvoll, diese zu einem Einzeiler zu machen:
quelle
quelle
Ausgabe : [1, 2]
quelle
Die
create_function()
Funktion ist ab PHP v7.2.0 veraltet . Sie können dasarray_map()
wie angegeben verwenden,Alternativ können Sie eine
array_column()
Funktion verwenden, die die Werte aus einer einzelnen Spalte der Eingabe zurückgibt, die durch den Spaltenschlüssel identifiziert wird. Optional kann ein Indexschlüssel bereitgestellt werden, um die Werte im zurückgegebenen Array durch die Werte aus der Spalte index_key des Eingabearrays zu indizieren. Sie können die array_column wie angegeben verwenden:quelle