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?

Zahir Hussain
quelle

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));
?>
Benoit
quelle
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);
}
Andy E.
quelle
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);
Mufaddal
quelle
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;
}
Sergio
quelle
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 :)

m3nda
quelle
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();
Styx
quelle
2

Versuche dies:-

 <?php
  print_r(json_decode(json_encode($response->response->docs),true));
 ?>
kunal
quelle
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.

Lucas Bacciotti
quelle
0

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

Rikin Adhyapak
quelle
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.

leon.clements
quelle
-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);
            }
        }
    }
nguyentrung206
quelle
Ihre Funktion gibt nichts zurück. Auf keinen Fall funktioniert es!
Rotimi