Ich integriere eine API in meine Website, die mit in Objekten gespeicherten Daten arbeitet, während mein Code mit Arrays geschrieben wird.
Ich hätte gerne eine Quick-and-Dirty-Funktion, um ein Objekt in ein Array umzuwandeln.
Harald
Ich integriere eine API in meine Website, die mit in Objekten gespeicherten Daten arbeitet, während mein Code mit Arrays geschrieben wird.
Ich hätte gerne eine Quick-and-Dirty-Funktion, um ein Objekt in ein Array umzuwandeln.
Jeff Standen
Sie können tief verschachtelte Objekte schnell in assoziative Arrays konvertieren, indem Sie sich auf das Verhalten der JSON-Codierungs-/Decodierungsfunktionen verlassen:
$array = json_decode(json_encode($nested_object), true);
Dies ist die beste Lösung, wenn Sie eine rekursive Konvertierung mit voller Tiefe wünschen (und sich natürlich nicht um die schlechte Leistung kümmern).
– Julian Habekost
11. November 2014 um 16:26 Uhr
Übrigens scheint dies unter PHP 5.5 nicht mehr zu funktionieren, Sie erhalten wieder ein Array von Objekten zurück
– Christian Maioli M.
15. Juli 2015 um 22:01 Uhr
Bei allem Respekt, ich denke, es funktioniert immer noch … vergessen Sie nicht, den 2. Parameter auf wahr zu setzen.
– Kirk B
12. August 2015 um 22:09 Uhr
Der zweite Parameter löste das Problem und funktionierte für PHP 5.6.25. Danke!
– Ju Oliveira
21. Dezember 2017 um 14:54 Uhr
@sics(, @celsowm ): Sie können steuern, was (auch: wie) exportiert werden soll, indem Sie JsonSerializable in Ihre Klasse implementieren: php.net/manual/en/class.jsonserializable.php
– Jürgen
19. Februar 2019 um 14:31 Uhr
Mir persönlich gefällt die Idee nicht, die Funktion für jeden Wert abzurufen. Ich habe eine ähnliche Version, aber in 3 Zeilen: function objectToArray($o) { $a = array(); foreach ($o as $k => $v) $a[$k] = (is_array($v) || is_object($v)) ? objectToArray($v): $v; return $a; }
Dies setzt einfach alles, was kein Objekt oder Array ist, und fährt ohne wiederholten Aufruf der Methode fort, sofern dies nicht erforderlich ist.
– SpYk3HH
17. Januar 2014 um 15:38 Uhr
@SpYk3HH: Schreiben Sie Ihre eigene Antwort?
– DanMan
28. Mai 2014 um 8:49 Uhr
Der erste Treffer für „php object to assoc array“ ist stackoverflow.com/questions/4345554/…
– Chris
26. März 2017 um 2:08 Uhr
Dies (und die Version von @SpYk3HH) scheint für mich noch langsamer zu funktionieren als die Option json_encode (stackoverflow.com/a/16111687/470749). Ich weiß nicht, warum diese Ansätze jemals vorzuziehen wären.
– Ryan
6. Juni 2018 um 22:25 Uhr
@Ryan json-Kodierung und -Dekodierung funktioniert nicht mit NaN- und INFINITE-Werten für Float und kann möglicherweise andere Probleme haben, die mir nicht aus dem Kopf fallen, aber in vielen Fällen ist dies möglicherweise eine bessere Option. Was die Optimierung betrifft, braucht es Kontext – lassen Sie mich einen Beitrag hinzufügen, den ich zu diesem Thema geschrieben habe evidentlycube.com/blog/game-optimization/when-to-optimize. Unter dem Strich sollten Sie keine Dinge optimieren, die keinen großen Teil der Laufzeit beanspruchen, da die Vorteile im Kontext der gesamten Anwendung bedeutungslos sind.
– Maurycy
7. Juni 2018 um 8:23 Uhr
Ramon K.
Wenn Ihre Objekteigenschaften öffentlich sind, können Sie Folgendes tun:
$array = (array) $object;
Wenn sie privat oder geschützt sind, haben sie seltsame Schlüsselnamen im Array. In diesem Fall benötigen Sie also die folgende Funktion:
function dismount($object) {
$reflectionClass = new ReflectionClass(get_class($object));
$array = array();
foreach ($reflectionClass->getProperties() as $property) {
$property->setAccessible(true);
$array[$property->getName()] = $property->getValue($object);
$property->setAccessible(false);
}
return $array;
}
Wenn Ihre Eigenschaft geschützt ist, wird sie durch setAccessible(false) wieder in die geschützte Sichtbarkeit geändert? oder macht es es privat?
– Nick Mitchell
15. Mai 2014 um 2:05 Uhr
Die einzige Lösung, die ich gefunden habe, funktionierte mit geschützten Eigenschaften. Danke
– dav
13. Juni 2014 um 3:19 Uhr
beste Lösung für private und geschützte Variablen!!
– HIRA THAKUR
22. Februar 2016 um 4:48 Uhr
Hier die Zeile $property->setAccessible(false); wird auf jedem Grundstück hingerichtet – auch wenn es öffentlich war…
– François Bourgeois
24. Juni 2016 um 11:09 Uhr
Ich nehme an, ein anderer Ansatz wäre, es als Array umzuwandeln und dann das Textpräfix von den privaten Eigenschaften zu entfernen. Etwas weniger gefährlich, da Ihre Methode riskiert, öffentliche Eigenschaften privat zu machen
– Stefan R
9. Juli 2018 um 15:23 Uhr
Peter Mortensen
Wie wäre es mit get_object_vars($obj)
? Es erscheint nützlich, wenn Sie nur auf die öffentlichen Eigenschaften eines Objekts zugreifen möchten.
Sehen get_object_vars.
Wenn Ihre Eigenschaft geschützt ist, wird sie durch setAccessible(false) wieder in die geschützte Sichtbarkeit geändert? oder macht es es privat?
– Nick Mitchell
15. Mai 2014 um 2:05 Uhr
Die einzige Lösung, die ich gefunden habe, funktionierte mit geschützten Eigenschaften. Danke
– dav
13. Juni 2014 um 3:19 Uhr
beste Lösung für private und geschützte Variablen!!
– HIRA THAKUR
22. Februar 2016 um 4:48 Uhr
Hier die Zeile $property->setAccessible(false); wird auf jedem Grundstück hingerichtet – auch wenn es öffentlich war…
– François Bourgeois
24. Juni 2016 um 11:09 Uhr
Ich nehme an, ein anderer Ansatz wäre, es als Array umzuwandeln und dann das Textpräfix von den privaten Eigenschaften zu entfernen. Etwas weniger gefährlich, da Ihre Methode riskiert, öffentliche Eigenschaften privat zu machen
– Stefan R
9. Juli 2018 um 15:23 Uhr
Isius
class Test{
const A = 1;
public $b = 'two';
private $c = test::A;
public function __toArray(){
return call_user_func('get_object_vars', $this);
}
}
$my_test = new Test();
var_dump((array)$my_test);
var_dump($my_test->__toArray());
Ausgabe
array(2) {
["b"]=>
string(3) "two"
["Testc"]=>
int(1)
}
array(1) {
["b"]=>
string(3) "two"
}
Vor- und Nachteile dieser Lösung? Was ist mit einer Klasse, die als class Test { const A = 1; public $parent = neuer Test(); }
– Matteo Gaggiano
21. April 2017 um 9:47 Uhr