Wie kann ich ein solches Array in ein Objekt konvertieren?
[128] => Array
(
[status] => Figure A.
Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution.
)
[129] => Array
(
[status] => The other day at work, I had some spare time
)
$a = (object)['hello' => 'world'];
Antworten:
Im einfachsten Fall reicht es wahrscheinlich aus, das Array als Objekt zu "gießen":
Eine andere Möglichkeit wäre, eine Standardklasse als Variable zu instanziieren und Ihr Array zu durchlaufen, während Sie die Werte neu zuweisen:
Wie Edson Medina betonte, besteht eine wirklich saubere Lösung darin, die integrierten
json_
Funktionen zu verwenden:Dies konvertiert auch (rekursiv) alle Ihre Sub-Arrays in Objekte, die Sie möglicherweise möchten oder nicht. Leider hat es einen 2-3x Performance-Hit gegenüber dem Loop-Ansatz.
Warnung! (danke an Ultra für den Kommentar):
quelle
x
im Array enthält einen Verweis auf ein anderes Array. Dann$object->x
nach der Ausführung Ihrer Einzeiler wird ein Duplikat sein$array['x']
, nicht mehr ein Verweis auf das Original - Array. Dies kann in einigen Anwendungen harmlos sein, aber bei großen Arrays wird Speicher verschwendet und die Ausführung kann durcheinander gebracht werden, wenn die Referenz später verwendet wird.Sie können einfach Typ Casting verwenden, um ein Array in ein Objekt zu konvertieren.
quelle
Der einfache Weg wäre
Aber das willst du nicht. Wenn Sie Objekte wollen, möchten Sie etwas erreichen, aber das fehlt in dieser Frage. Die Verwendung von Objekten nur zum Zweck der Verwendung von Objekten macht keinen Sinn.
quelle
Schneller Hack:
Nicht schön, funktioniert aber.
quelle
$this
in den folgenden Kommentaren nicht als Accessor verwendet wird, wird stark impliziert, dass er / sie einestdClass
Instanz als Ausgabe wünscht und nicht Eine benutzerdefinierte Klasse, wie sie Ihre Antwort verwendet. Ich stimme der Eleganz dieser Lösung zu, aber leider ist es ein ziemlich häufig verwendetes Muster, um dieses Problem mit verschachtelten Arrays zu lösen, bei denen das Casting in ein Objekt nicht funktioniert. Es ist auch möglich, dass OP eine Schnittstelle verwendet, die ein Objekt als Eingabe und kein Array benötigt.Hier sind drei Möglichkeiten:
Ein echtes Objekt vortäuschen:
Konvertieren Sie das Array in ein Objekt, indem Sie es in ein Objekt umwandeln:
Konvertieren Sie das Array manuell in ein Objekt:
quelle
Es wird zu einfach. Dadurch wird auch ein Objekt für rekursive Arrays erstellt:
quelle
false
an übergeben ,json_decode()
wird ein assoziatives Array zurückgegeben.true
anjson_decode
gibt ein assoziatives Array zurück,false
ist die Standardeinstellung und gibt eineStdClass
Instanz zurück.Je nachdem, wo Sie das benötigen und wie Sie auf das Objekt zugreifen, gibt es verschiedene Möglichkeiten.
Zum Beispiel: Geben Sie es einfach ein
Am kompatibelsten ist jedoch die Verwendung einer Dienstprogrammmethode (die noch nicht Teil von PHP ist), die Standard-PHP-Casting basierend auf einer Zeichenfolge implementiert, die den Typ angibt (oder indem sie ignoriert wird, indem nur der Wert de-referenziert wird):
Das Anwendungsbeispiel in Ihrem Fall ( Online-Demo ):
quelle
Dieser hat für mich gearbeitet
Verwendungszweck :
kehrt zurück :
wie üblich können Sie es wie folgt schleifen:
quelle
$obj = (object) $array;
funktioniert jedoch nicht für mehrdimensionale Arrays.Soweit mir bekannt ist, gibt es keine integrierte Methode, aber es ist so einfach wie eine einfache Schleife:
Sie können dies erläutern, wenn Sie es benötigen, um Ihr Objekt rekursiv zu erstellen.
quelle
Mit der Funktion (Objekt) können Sie Ihr Array in ein Objekt konvertieren.
Das Ergebnis ist ein Objekt, das Arrays enthält:
quelle
Wenn Sie dies mit mehrdimensionalen Arrays verwenden möchten, sollten Sie eine Rekursion verwenden.
quelle
Ich würde definitiv einen sauberen Weg wie diesen gehen:
wenn Sie einreichen:
Sie werden dies bekommen:
Ich fand es logischer, die obigen Antworten von Objekten zu vergleichen, um sie für den Zweck zu verwenden, für den sie gemacht wurden (eingekapselte süße kleine Objekte).
Durch die Verwendung von get_object_vars wird außerdem sichergestellt, dass im manipulierten Objekt keine zusätzlichen Attribute erstellt werden (Sie möchten weder ein Auto mit einem Familiennamen noch eine Person mit 4 Rädern).
quelle
Sie können auch ein ArrayObject verwenden, zum Beispiel:
quelle
Die, die ich benutze (es ist ein Klassenmitglied):
quelle
Wenig komplizierte aber leicht zu erweiternde Technik:
Angenommen, Sie haben ein Array
Angenommen, Sie haben eine Personenklasse, die möglicherweise mehr oder weniger Attribute aus diesem Array enthält. zum Beispiel
Wenn Sie Ihr Array dennoch in das Personenobjekt ändern möchten. Sie können die ArrayIterator-Klasse verwenden.
Jetzt haben Sie ein Iteratorobjekt.
Erstellen Sie eine Klasse, die die FilterIterator-Klasse erweitert. wo müssen Sie die abstrakte Methode akzeptieren definieren. Folge dem Beispiel
Die obige Impelmentation bindet die Eigenschaft nur, wenn sie in der Klasse vorhanden ist.
Fügen Sie der Klasse PersonIterator eine weitere Methode hinzu
Stellen Sie sicher, dass in Ihrer Klasse Mutatoren definiert sind. Jetzt können Sie diese Funktion aufrufen, in der Sie ein Objekt erstellen möchten.
quelle
Rekursion ist dein Freund:
quelle
Dies erfordert PHP7, da ich mich für die Verwendung einer Lambda-Funktion entschieden habe, um die 'innere Funktion' innerhalb der Hauptfunktion zu sperren. Die Lambda-Funktion wird rekursiv aufgerufen, daher ist Folgendes erforderlich: "use (& $ innerfunc)". Sie könnten es in PHP5 tun, aber die innere Funktion nicht verbergen.
quelle
benutze diese Funktion, die ich gemacht habe:
Verwendungszweck:
quelle
Einzeiler
quelle
x
im Array enthält einen Verweis auf ein anderes Array. Dann$object->x
nach der Ausführung Ihrer Einzeiler wird ein Duplikat sein$result_array['x']
, nicht die gleiche Anordnung.Einfach:
Beispiel:
Dann ist folgendes wahr:
quelle
Sie können dies auch tun, indem Sie links von der Variablen (Objekt) hinzufügen , um ein neues Objekt zu erstellen.
http://codepad.org/9YmD1KsU
quelle
Die Verwendung
json_encode
ist problematisch, da nicht UTF-8-Daten verarbeitet werden. Es ist erwähnenswert, dass diejson_encode
/json_encode
-Methode auch nicht assoziative Arrays als Arrays belässt. Dies kann sein oder nicht, was Sie wollen. Ich war kürzlich in der Lage, die Funktionalität dieser Lösung neu zu erstellen, ohne jedochjson_
Funktionen zu verwenden. Folgendes habe ich mir ausgedacht:quelle
Beste Methode der Welt :)
Wenn Sie verschiedene Methoden verwenden, treten Probleme auf. Dies ist die beste Methode. Hast du jemals gesehen.
quelle
Mehrdimensionale Arrays in ein Objekt. Dieser Code wird für die Konvertierung der Try-and-Catch-Methode der Bing-Such-API verwendet.
quelle
Sie können Reflection verwenden:
quelle
CakePHP verfügt über eine rekursive Set :: map-Klasse, die ein Array grundsätzlich einem Objekt zuordnet. Möglicherweise müssen Sie das Aussehen des Arrays ändern, damit das Objekt so aussieht, wie Sie es möchten.
http://api.cakephp.org/view_source/set/#line-158
Im schlimmsten Fall können Sie möglicherweise einige Ideen aus dieser Funktion gewinnen.
quelle
Natürlich nur eine Extrapolation der Antworten einiger anderer Leute, aber hier ist die rekursive Funktion, die jedes mulchdimensionale Array in ein Objekt umwandelt:
Und denken Sie daran , dass , wenn das Array numerische Tasten hat sie noch in dem resultierenden Objekt referenziert wird unter Verwendung
{}
(zB:$obj->prop->{4}->prop
)quelle
Inspiriert von all diesen Codes habe ich versucht, eine erweiterte Version zu erstellen, die Folgendes unterstützt: spezifischen Klassennamen, Konstruktormethode, 'Beans'-Muster und strengen Modus vermeiden (nur vorhandene Eigenschaften festlegen):
quelle
Code
Diese Funktion funktioniert genauso wie
json_decode(json_encode($arr), false)
.Testen
Test 1: Flaches Array
Ausgabe:
Test 2: Array von Objekten
Ausgabe:
Test 3: Objekt
Ausgabe:
quelle
Ich habe es auf ganz einfache Weise getan.
quelle