php stdClass zum Array

195

Ich habe ein Problem beim Konvertieren eines Objekts stdClass in ein Array. Ich habe es so versucht:

return (array) $booking;

oder

return (array) json_decode($booking,true);

oder

return (array) json_decode($booking);

Das Array vor der Besetzung ist mit einem Datensatz voll, nach meinem Versuch, es zu besetzen, ist es leer. Wie kann man es umwandeln / konvertieren, ohne seine Zeilen zu löschen?

Array vor der Besetzung:

array(1) {   [0]=>   object(stdClass)#23 (36) {     ["id"]=>     string(1) "2"     ["name"]=>     string(0) ""     ["code"]=>     string(5) "56/13"   } } 

nach der Besetzung ist leer NULL, wenn ich versuche, eine zu machen var_dump($booking);

Ich habe diese Funktion auch ausprobiert, aber immer leer:

public function objectToArray($d) {
        if (is_object($d)) {
            // Gets the properties of the given object
            // with get_object_vars function
            $d = get_object_vars($d);
        }

        if (is_array($d)) {
            /*
            * Return array converted to object
            * Using __FUNCTION__ (Magic constant)
            * for recursive call
            */
            return array_map(__FUNCTION__, $d);
        }
        else {
            // Return array
            return $d;
        }
    }
Alessandro Minoccheri
quelle
php.net/var_dump ... php.net/var_export - vorher return. Und json_decodeauf einem Array zu laufen scheint mir ziemlich verzweifelt, wahrscheinlich zu lange vor dem Computer zu sitzen und es ist jetzt Zeit, eine Pause zu machen?
hakre
Nur um zu verdeutlichen: var_dump($booking);Ausgänge NULL?
hakre
Nach der Besetzung ja, und wenn ich versuche, dies zu drucken: $ booking [0] ['id']
gib
Vielleicht interessiert Sie Folgendes: Wie erhalten Sie nützliche Fehlermeldungen in PHP? - Wie auch immer, ich habe var_dump() vor dem Casting darum gebeten . Verwenden Sie übrigens nicht denselben Variablennamen erneut. Wenn $bookinges etwas vor dem Casting war, sollte es immer noch etwas vor dem Casting sein und nicht etwas anderes danach. Unterscheiden Sie zwischen Eingabe- und Verarbeitungsvariablen, da sonst Probleme auftreten, die Sie nicht mehr verstehen, was Sie dort tun.
hakre
Das Kürzen der Frage (wie das Entfernen des benutzerdefinierten Funktionscodes) kann nützlich sein, um die akzeptierte Antwort zu sehen, ohne nach unten scrollen zu müssen
cnlevy

Antworten:

430

Die faule Einzeiler-Methode

Sie können dies in einem Einzeiler mithilfe der JSON-Methoden tun, wenn Sie bereit sind, ein wenig an Leistung zu verlieren (obwohl einige angegeben haben, dass dies schneller ist als das rekursive Durchlaufen der Objekte - höchstwahrscheinlich, weil PHP Funktionen nur langsam aufruft ). " Aber das habe ich schon gemacht ", sagst du. Nicht genau - Sie haben json_decodedas Array verwendet, aber Sie müssen es json_encodezuerst mit codieren .

Bedarf

Die json_encodeund json_decodeMethoden. Diese werden automatisch in PHP 5.2.0 und höher gebündelt. Wenn Sie eine ältere Version verwenden, gibt es auch eine PECL-Bibliothek (in diesem Fall sollten Sie Ihre PHP-Installation wirklich aktualisieren. Die Unterstützung für 5.1 wurde 2006 eingestellt.)


Konvertieren eines array/ stdClass->stdClass

$stdClass = json_decode(json_encode($booking));

Konvertieren eines array/ stdClass->array

Das Handbuch gibt das zweite Argument an json_decodeals:

assoc
Wenn TRUEzurückgegebene Objekte in assoziative Arrays konvertiert werden.

Daher konvertiert die folgende Zeile Ihr gesamtes Objekt in ein Array:

$array = json_decode(json_encode($booking), true);
h2ooooooo
quelle
1
Wenn (array) $booking;in a var_dumpis NULL(wie von OP geschrieben), raten Sie mal, was dieser Code zurückgibt?
hakre
@hakre Es scheint nicht so, als ob es NULLnach dem Casting als Array ist. Ich denke, OP bedeutet, dass es NULLnach der Verwendung ist, json_decode($array)was laut Handbuch sinnvoll ist . NULL wird zurückgegeben, wenn der
JSON
4
@AlessandroMinoccheri Der Grund, warum es vorher nicht funktioniert hat, war, bevor Sie es json_decode()auf einem Array verwendet haben. json_decodesollte für eine JSON-Zeichenfolge verwendet werden. Wenn wir es daher zuerst als JSON-Zeichenfolge ( json_encode) codieren und dann (mithilfe unserer JSON-Zeichenfolge) dekodieren, funktioniert es einwandfrei.
h2ooooooo
3
Hat jeder vergessen, dass Sie Ihre Typen verlieren, die nicht in der JSON-Spezifikation definiert sind (z. B. Daten)? Wenn Sie diesen Ansatz verwenden, benötigen Sie einen Reviver. Dies ist nur dann gut, wenn Sie grundlegende Typen wie Zahlen, Zeichenfolgen und Boolesche Werte haben.
Denis Pshenov
1
Tolle Antwort, ich habe gerade json_decode ($ stdClass, true) verwendet;)
didando8a
68

Verwenden Sie diese Funktion, um ein Standardarray des gewünschten Typs wiederherzustellen ...

return get_object_vars($booking);
Robzero
quelle
19
Dies ist nicht rekursiv
Gawpertron
17

Da es sich um ein Array handelt, bevor Sie es umsetzen, macht das Umwandeln keinen Sinn.

Möglicherweise möchten Sie eine rekursive Besetzung, die ungefähr so ​​aussieht:

function arrayCastRecursive($array)
{
    if (is_array($array)) {
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                $array[$key] = arrayCastRecursive($value);
            }
            if ($value instanceof stdClass) {
                $array[$key] = arrayCastRecursive((array)$value);
            }
        }
    }
    if ($array instanceof stdClass) {
        return arrayCastRecursive((array)$array);
    }
    return $array;
}

Verwendung:

$obj = new stdClass;
$obj->aaa = 'asdf';
$obj->bbb = 'adsf43';
$arr = array('asdf', array($obj, 3));

var_dump($arr);
$arr = arrayCastRecursive($arr);
var_dump($arr);

Ergebnis vor:

array
    0 => string 'asdf' (length = 4)
  1 => 
    array
        0 =>
        object(stdClass)[1]
          public 'aaa' => string 'asdf' (length = 4)
          public 'bbb' => string 'adsf43' (length = 6)
      1 => int 3

Ergebnis nach:

array
    0 => string 'asdf' (length = 4)
  1 => 
    array
        0 =>
        array
          'aaa' => string 'asdf' (length = 4)
          'bbb' => string 'adsf43' (length = 6)
      1 => int 3

Hinweis:

Getestet und Arbeiten mit komplexen Arrays, in denen ein stdClass-Objekt andere stdClass-Objekte enthalten kann.

Vlad Preda
quelle
Toll. Funktioniert jetzt für stdClass-Objekte, die stdClass-Objekte enthalten :)
Vlad Preda
14

Bitte verwenden Sie die folgende PHP-Funktion, um PHP stdClass in Array zu konvertieren

get_object_vars($data)
Nalantha
quelle
2
Beachten Sie, dass diese Funktion nicht rekursiv ist. Eine rekursive Lösung finden Sie in der Antwort von Carlo Fontanos .
Courtney Miles
12

Verwenden Sie die integrierte Typumwandlungsfunktion, geben Sie einfach ein

$realArray = (array)$stdClass;
David Clews
quelle
1
Ich bevorzuge dies gegenüber json_decode / encode, viel sauberer +1
Logan
1
Diese Methode ist sauberer, aber auch nicht rekursiv und funktioniert genauso wie get_object_vars (). Während die Methode json_decode / encode das Gefühl eines Hacks hat, funktioniert sie rekursiv.
Debbie V
3

Ich habe es einfach gegoogelt und hier eine praktische Funktion gefunden, die nützlich ist, um das stdClass-Objekt rekursiv in ein Array zu konvertieren.

<?php
function object_to_array($object) {
 if (is_object($object)) {
  return array_map(__FUNCTION__, get_object_vars($object));
 } else if (is_array($object)) {
  return array_map(__FUNCTION__, $object);
 } else {
  return $object;
 }
}
?>

BEARBEITEN : Ich habe diese Antwort mit Inhalten aus der verknüpften Quelle aktualisiert (die jetzt ebenfalls geändert wird), danke an mason81 für den Vorschlag.

Shasi Kanth
quelle
1
Bitte geben Sie beim nächsten Mal den relevanten Inhalt aus der verlinkten Quelle an. Der von Ihnen angegebene Link hat sich geändert und ist jetzt irrelevant und nutzlos.
Mason81
Das habe ich gesucht, vielen Dank.
0

Hier ist eine Version von Carlos Antwort, die in einer Klasse verwendet werden kann:

class Formatter
{
    public function objectToArray($data)
    {
        if (is_object($data)) {
            $data = get_object_vars($data);
        }

        if (is_array($data)) {
            return array_map(array($this, 'objectToArray'), $data);
        }

        return $data;
    }
}
Loren
quelle
0

Der folgende Code liest alle E-Mails und druckt den Betreff, den Text und das Datum aus.

<?php
  $imap=imap_open("Mailbox","Email Address","Password");
  if($imap){$fixMessages=1+imap_num_msg($imap);  //Check no.of.msgs
/*
By adding 1 to "imap_num_msg($imap)" & starting at $count=1
   the "Start" & "End" non-messages are ignored
*/
    for ($count=1; $count<$fixMessages; $count++){
      $objectOverview=imap_fetch_overview($imap,$count,0);
print '<br>$objectOverview: '; print_r($objectOverview);
print '<br>objectSubject ='.($objectOverview[0]->subject));
print '<br>objectDate ='.($objectOverview[0]->date);
      $bodyMessage=imap_fetchbody($imap,$count,1);
print '<br>bodyMessage ='.$bodyMessage.'<br><br>';
    }  //for ($count=1; $count<$fixMessages; $count++)
  }  //if($imap)
  imap_close($imap);
?>

Dies gibt Folgendes aus:

$objectOverview: Array ( [0] => stdClass Object ( [subject] => Hello
[from] => Email Address [to] => Email Address [date] => Sun, 16 Jul 2017 20:23:18 +0100
[message_id] =>  [size] => 741 [uid] => 2 [msgno] => 2 [recent] => 0 [flagged] => 0 
[answered] => 0 [deleted] => 0 [seen] => 1 [draft] => 0 [udate] => 1500232998 ) )
objectSubject =Hello
objectDate =Sun, 16 Jul 2017 20:23:18 +0100
bodyMessage =Test 

Nachdem ich mit verschiedenen Vorschlägen zu kämpfen hatte, habe ich Trial & Error verwendet, um diese Lösung zu finden. Ich hoffe es hilft.

walter1957
quelle
0

Hier ist die beste Objekt-zu-Array-Funktion, die ich habe - funktioniert rekursiv:

function object_to_array($obj, &$arr){

    if(!is_object($obj) && !is_array($obj)){
        $arr = $obj;
        return $arr;
    }

    foreach ($obj as $key => $value)
    {
        if (!empty($value))
        {
            $arr[$key] = array();
            object_to_array_v2($value, $arr[$key]);
        }
        else
        {
            $arr[$key] = $value;
        }
    }
    return $arr;
}

$ clean_array = object_to_array ($ object_data_here);

nsdb
quelle