Konvertieren Sie ein PHP-Objekt in ein assoziatives Array

Lesezeit: 4 Minuten

Konvertieren Sie ein PHP Objekt in ein assoziatives Array
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.

1646984647 680 Konvertieren Sie ein PHP Objekt in ein assoziatives Array
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

1646984648 471 Konvertieren Sie ein PHP Objekt in ein assoziatives Array
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

1646984648 750 Konvertieren Sie ein PHP Objekt in ein assoziatives Array
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

Konvertieren Sie ein PHP Objekt in ein assoziatives Array
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


990240cookie-checkKonvertieren Sie ein PHP-Objekt in ein assoziatives Array

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy