Wie konvertiere ich ein mehrdimensionales Array in ein Objekt in PHP?

Lesezeit: 4 Minuten

Benutzeravatar von Patrioticcow
Patriotische Kuh

Ich habe ein mehrdimensionales Array:

$image_path = array('sm'=>$sm,'lg'=>$lg,'secondary'=>$sec_image);

Hexe sieht so aus:

[_media_path:protected] => Array
            (
                [main_thumb] => http://example.com/e4150.jpg
                [main_large] => http://example.com/e4150.jpg
                [secondary] => Array
                    (
                        [0] => http://example.com/e4150.jpg
                        [1] => http://example.com/e4150.jpg
                        [2] => http://example.com/e9243.jpg
                        [3] => http://example.com/e9244.jpg
                    )

            )

und ich möchte es in ein Objekt umwandeln und die Schlüsselnamen beibehalten.

Irgendwelche Ideen?

Danke

bearbeiten: $obj = (object)$image_path; scheint nicht zu funktionieren. Ich brauche eine andere Art, das Array zu durchlaufen und ein Objekt zu erstellen

  • Können Sie uns ein besseres Beispiel dafür geben, wie das Objekt aussehen soll? Möchten Sie die Schlüssel in Eigenschaften umwandeln? für welchen Zweck benötigen Sie ein Objekt?

    – mp

    7. Februar 2012 um 1:38 Uhr

  • statt zu verwenden [] um den Wert zu erhalten, den ich verwenden muss ->

    – Patriotische Kuh

    7. Februar 2012 um 1:42 Uhr

Benutzeravatar von Charlie Schliesser
Charlie Schliesser

Eine schnelle Möglichkeit, dies zu tun, ist:

$obj = json_decode(json_encode($array));

Erläuterung

json_encode($array) konvertiert das gesamte mehrdimensionale Array in eine JSON-Zeichenfolge. (php.net/json_encode)

json_decode($string) konvertiert die JSON-Zeichenfolge in a stdClass Objekt. Wenn Sie vorbeikommen TRUE als zweites Argument dazu json_decode, erhalten Sie ein assoziatives Array zurück. (php.net/json_decode)

Ich denke nicht, dass die Leistung hier im Vergleich zum rekursiven Durchlaufen des Arrays und Konvertieren von allem sehr auffällig ist, obwohl ich gerne einige Benchmarks davon sehen würde. Es funktioniert und es wird nicht verschwinden.

  • Dies sollte die Antwort sein, da das OP das gesamte mehrdimensionale Array haben möchte, nicht das Array der obersten Ebene.

    – AeroCross

    9. Oktober 2012 um 14:43 Uhr

  • Ich würde sagen, dass dies ein langsamer Weg ist, es zu tun. Wenn die Leistung ein Problem darstellt, würde ich diese Lösung vermeiden.

    – Kaleb Taylor

    27. Februar 2013 um 15:43 Uhr

  • das ist genial … Danke.

    – Nischant

    21. Januar 2015 um 11:14 Uhr

  • Ich habe diesen Code tatsächlich mit PHP 7.2 -> bewertet json_decode ist 5 mal schneller als array_map oder andere rekursive Operationen. Auch in php 5.4 die json_decode Lösung ist die schnellste Option, die ich finden konnte. Gute Antwort!

    – Philipp

    12. Juli 2018 um 20:54 Uhr

  • @ Mirceac21 Ihr Objekt kann implementiert werden JsonSerializable um zu definieren, wie es konvertiert wird.

    – Charlie Schliesser

    21. August 2018 um 14:37 Uhr


Benutzeravatar von Wayne Weibel
Wayne Weibel

Der beste Weg wäre, Ihre Datenstruktur von Anfang an als Objekt zu verwalten, wenn Sie die Möglichkeit haben:

$a = (object) array( ... ); $a->prop = $value; //and so on

Der schnellste Weg wäre jedoch der von @CharlieS bereitgestellte Ansatz mit json_decode(json_encode($a)).

Sie könnten das Array auch durch eine rekursive Funktion laufen lassen, um dasselbe zu erreichen. Ich habe dies nicht mit dem json-Ansatz verglichen, aber:

function convert_array_to_obj_recursive($a) {
    if (is_array($a) ) {
        foreach($a as $k => $v) {
            if (is_integer($k)) {
                // only need this if you want to keep the array indexes separate
                // from the object notation: eg. $o->{1}
                $a['index'][$k] = convert_array_to_obj_recursive($v);
            }
            else {
                $a[$k] = convert_array_to_obj_recursive($v);
            }
        }

        return (object) $a;
    }

    // else maintain the type of $a
    return $a; 
}

Hoffentlich hilft das.

BEARBEITEN: json_encode + json_decode erstellt ein Objekt wie gewünscht. Wenn das Array jedoch aus numerischen oder gemischten Indizes besteht (z. array('a', 'b', 'foo'=>'bar') ), können Sie die numerischen Indizes nicht mit Objektnotation referenzieren (z. B. $o->1 oder $o[1]). Die obige Funktion platziert alle numerischen Indizes in der Eigenschaft „index“, die selbst ein numerisches Array ist. so, dann könntest du das machen $o->index[1]. Dies behält die Unterscheidung eines konvertierten Arrays von einem erstellten Objekt bei und lässt die Option, Objekte zusammenzuführen, die möglicherweise numerische Eigenschaften haben.

  • Vielen Dank für die Bereitstellung der rekursiven Funktion. Ich denke, das ist wahrscheinlich hilfreich für viele Leute, die darüber stolpern. Ich werde den PHP-Quellcode überprüfen, um zu sehen, wie sich json_encode/decode in Bezug auf die Leistung vergleicht. Ich bin neugierig.

    – Charlie Schliesser

    23. Dezember 2013 um 4:40 Uhr

  • Sie können numerische Eigenschaften von Objekten über referenzieren $o->{1}.

    – Charlie Schliesser

    4. Februar 2014 um 15:35 Uhr

1444500cookie-checkWie konvertiere ich ein mehrdimensionales Array in ein Objekt in PHP?

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

Privacy policy