Wie konvertiere ich ein Objekt in ein Array?


204
<?php
   print_r($response->response->docs);
?>

Gibt Folgendes aus:

    Array 
(
    [0] => Object 
            (
                [_fields:private] => Array 
                                    (
                                        [id]=>9093 
                                        [name]=>zahir
                                    ) 
            Object 
            ( 
                [_fields:private] => Array 
                                    (
                                        [id]=>9094 
                                        [name]=>hussain
                                    )..
            )
)

Wie kann ich dieses Objekt in ein Array konvertieren? Ich möchte Folgendes ausgeben:

Array
(
    [0]=>
    (
        [id]=>9093 
        [name]=>zahir
    ) 
    [1]=>
    (
        [id]=>9094 
        [name]=>hussain
    )...
)

Ist das möglich?

Antworten:


133

Sie sollten sich get_object_vars ansehen , da Ihre Eigenschaften als privat deklariert sind. Sie sollten dies innerhalb der Klasse aufrufen und die Ergebnisse zurückgeben.

Seien Sie vorsichtig, für primitive Datentypen wie Zeichenfolgen funktioniert es hervorragend, aber ich weiß nicht, wie es sich mit verschachtelten Objekten verhält.

in deinem Fall musst du so etwas tun;

<?php
   print_r(get_object_vars($response->response->docs));
?>

385

Eindimensionale Arrays

Zum Konvertieren eindimensionaler Arrays können Sie mit (array)oder gibt get_object_vars, was Benoit in seiner Antwort erwähnt hat .

// Cast to an array
$array = (array) $object;
// get_object_vars
$array = get_object_vars($object);

Sie arbeiten etwas anders. Gibt beispielsweise get_object_varsein Array mit nur öffentlich zugänglichen Eigenschaften zurück, es sei denn, es wird aus dem Bereich des Objekts aufgerufen, das Sie übergeben (dh in einer Mitgliedsfunktion des Objekts). (array)Auf der anderen Seite wird in ein Array umgewandelt, in dem alle öffentlichen, privaten und geschützten Mitglieder des Arrays intakt sind, obwohl jetzt natürlich alle öffentlich.

Mehrdimensionale Arrays

Eine etwas schmutzige Methode besteht darin, die nativen JSON-Funktionen von PHP> = 5.2 zu verwenden, um in JSON zu codieren und dann zurück in ein Array zu decodieren. Dies schließt jedoch keine privaten und geschützten Mitglieder ein und ist nicht für Objekte geeignet, die Daten enthalten, die nicht JSON-codiert werden können (z. B. Binärdaten).

// The second parameter of json_decode forces parsing into an associative array
$array = json_decode(json_encode($object), true);

Alternativ wird die folgende Funktion von einem Objekt in ein Array mit privaten und geschützten Mitgliedern konvertiert, das von hier übernommen und für die Verwendung von Casting geändert wurde:

function objectToArray ($object) {
    if(!is_object($object) && !is_array($object))
        return $object;

    return array_map('objectToArray', (array) $object);
}

5
Die erste Lösung handhabte keine Mehrfachdimensionen, aber die zweite Lösung funktionierte hervorragend.
sbuck

1
Die zweite Lösung hat mich daran erinnert, dass es einen zweiten Parameter für json_decode () gibt, den ich vergessen habe. Danke.
Tyler

1
Ich frage mich, warum diese Antwort so viele Stimmen bekommt. Beide Lösungen sind weniger klar und hübsch als get_object_vars
RJD22

3
@ RJD22: Ich habe meine Antwort aktualisiert, um sie mehr zu einer "De-facto" -Ressource zu machen. Hoffentlich sehen Sie sie jetzt als würdig an. ;-) Beachten Sie an alle anderen, dass die "2. Lösung", auf die sich die Kommentare hier beziehen, die JSON-Lösung ist, die die 2. in meiner ersten Antwort war.
Andy E

GENIAL! Ich war von einer Lösung begeistert und habe nach unten gescrollt, um diese zu finden!
eozzy

44

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($response->response->docs), true);

2
Dies ist die einfachste Antwort auf dieses Problem. Ich habe es benutzt und es hat super funktioniert. Vielen Dank
Dustin Fraker

7
Nur eine Anmerkung - dies funktioniert, wenn Ihr Array gültige UTF8-Daten enthält. Wenn Ihr Array eine andere Codierung enthält, beispielsweise Win1250, schlägt dies fehl, da json_encode fehlschlägt (PHP 5.3)
Radek

Wie konvertiere ich es zurück in ein Objekt?
Pmpr

@ Matrix wieder json verwenden json_decode (json_encode ($ array), FALSE); Dies konvertiert auch (rekursiv) alle Ihre Sub-Arrays in Objekte,
Mufaddal

Ich wünschte, ich könnte dies mehr als einmal verbessern.
JohnFF

34

Vorsichtig:

$array = (array) $object;

führt eine flache Konvertierung durch ($ object-> innerObject = new stdClass () bleibt ein Objekt) und konvertiert mit json hin und her, aber es ist keine gute Idee, wenn die Leistung ein Problem darstellt.

Wenn Sie alle Objekte in assoziative Arrays konvertieren müssen, ist dies eine bessere Möglichkeit (Code, der aus dem Speicher kopiert wurde, an den ich mich nicht erinnere, wo):

function toArray($obj)
{
    if (is_object($obj)) $obj = (array)$obj;
    if (is_array($obj)) {
        $new = array();
        foreach ($obj as $key => $val) {
            $new[$key] = toArray($val);
        }
    } else {
        $new = $obj;
    }

    return $new;
}

Ich kann das Array, das sich aus einem Objekt-Casting ergibt, nicht lesen: codepad.viper-7.com/AkX5pq Haben Sie eine Erklärung dazu?
Damien

1
Diese Antwort gefällt mir am besten. Die rekursive Funktion von Andy E macht im Wesentlichen dasselbe, aber ich finde diese leichter zu verstehen.
HartleySan

20
$array = json_decode(json_encode($object), true);

Ich habe verschiedene Möglichkeiten ausprobiert, um foreachein Objekt zu erstellen, und DAS ist wirklich die einfachste und coolste Problemumgehung, die ich je gesehen habe. Nur eine Zeile :)


Es funktioniert perfekt nur mit öffentlichen Objektattributen. Berücksichtigt keine privaten.
Limon

Hier sind einige Erklärungen zur Verwendung der JsonSerialize-Funktion, aber es handelt sich nicht um eine einzeilige Lösung, und ich habe darüber gelesen, dass dies keine gute Vorgehensweise ist :( stackoverflow.com/questions/7005860/… . Vielen Dank für den Rat.
m3nda

Wie konvertiere ich es zurück in ein Objekt?
Pmpr

18

Einfache Version:

$arrayObject = new ArrayObject($object);
$array = $arrayObject->getArrayCopy();

Aktualisierte rekursive Version:

class RecursiveArrayObject extends ArrayObject
{
    function getArrayCopy()
    {
        $resultArray = parent::getArrayCopy();
        foreach($resultArray as $key => $val) {
            if (!is_object($val)) {
                continue;
            }
            $o = new RecursiveArrayObject($val);
            $resultArray[$key] = $o->getArrayCopy();
        }
        return $resultArray;
    }
}

$arrayObject = new RecursiveArrayObject($object);
$array = $arrayObject->getArrayCopy();

2

Versuche dies:-

 <?php
  print_r(json_decode(json_encode($response->response->docs),true));
 ?>

2

Ich hatte das gleiche Problem und löste es mit den oben genannten get_object_vars .

Außerdem musste ich mein Objekt mit json_decode konvertieren und das Array mit der "for" -Schleife der alten Schule (und nicht für jede) iterieren.


0

Sie können auch die array_values ​​() -Methode von php verwenden


2
Das kannst du nicht. "Array_values ​​() erwartet, dass Parameter 1 Array ist, Objekt angegeben".
Manatwork

0

Ich bin auf ein Problem mit der Antwort von Andy Earnshaw gestoßen, weil ich diese Funktion in einer separaten Klasse in meiner Anwendung "HelperFunctions" herausgerechnet hatte, was bedeutete, dass der rekursive Aufruf von objectToArray () fehlgeschlagen war.

Ich habe dies überwunden, indem ich den Klassennamen im Aufruf array_map wie folgt angegeben habe:

public function objectToArray($object) {
    if (!is_object($object) && !is_array($object))
        return $object;
    return array_map(array("HelperFunctions", "objectToArray"), (array) $object);
}

Ich hätte das in den Kommentaren geschrieben, aber ich habe noch nicht genug Ruf.


-2
//My Function is worked. Hope help full for you :)
      $input = [
            '1' => (object) [1,2,3],
            '2' => (object) [4,5,6,
                (object) [6,7,8,
                [9, 10, 11,
                    (object) [12, 13, 14]]]
            ],
            '3' =>[15, 16, (object)[17, 18]]
        ];

        echo "<pre>";
        var_dump($input);
        var_dump(toAnArray($input));

      public function toAnArray(&$input) {

        if (is_object($input)) {
            $input = get_object_vars($input);
        }
        foreach ($input as &$item) {
            if (is_object($item) || is_array($item)) {
                if (is_object($item)) {
                    $item = get_object_vars($item);
                }
                self::toAnArray($item);
            }
        }
    }

Ihre Funktion gibt nichts zurück. Auf keinen Fall funktioniert es!
Rotimi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.