php stdClass au tableau

195

J'ai un problème pour convertir un objet stdClass en tableau. J'ai essayé de cette façon:

return (array) $booking;

ou

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

ou

return (array) json_decode($booking);

Le tableau avant la distribution est plein avec un enregistrement, après mon essai de distribution, il est vide. Comment le convertir / le convertir sans supprimer ses lignes?

tableau avant transtypage:

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

après que le plâtre est vide NULL si j'essaye de faire un var_dump($booking);

J'ai également essayé cette fonction mais toujours vide:

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
la source
php.net/var_dump ... php.net/var_export - avant return. Et courir json_decodesur un tableau me semble assez désespéré, probablement assis trop longtemps devant l'ordinateur et il est maintenant temps de faire une pause?
hakre
Juste pour clarifier: var_dump($booking);sorties NULL?
hakre
après le casting oui, et si j'essaie d'imprimer ceci: $ booking [0] ['id'] retourne moi qui n'existe pas
Alessandro Minoccheri
Vous pourriez être intéressé à lire: Comment obtenir des messages d'erreur utiles en PHP? - Quoi qu'il en soit, je le demandais var_dump() avant le casting. Ne réutilisez pas le même nom de variable btw. s'il y $bookingavait quelque chose avant le casting, ce devrait toujours être ce quelque chose avant le casting et pas quelque chose de différent après. Différence entre les variables d'entrée et de traitement, sinon vous rencontrez des problèmes que vous ne comprenez plus ce que vous y faites.
hakre
Raccourcir la question (comme supprimer le code de fonction personnalisé) pourrait être utile pour voir la réponse acceptée sans avoir à faire défiler vers le bas
cnlevy

Réponses:

432

La méthode one-liner paresseuse

Vous pouvez le faire dans une seule ligne en utilisant les méthodes JSON si vous êtes prêt à perdre un tout petit peu de performances (bien que certains aient signalé qu'il était plus rapide que d'itérer récursivement à travers les objets - probablement parce que PHP est lent à appeler les fonctions ). " Mais je l'ai déjà fait ", dites-vous. Pas exactement - vous l'avez utilisé json_decodesur le tableau, mais vous devez d'abord le coder json_encode.

Exigences

Les méthodes json_encodeet json_decode. Celles-ci sont automatiquement regroupées en PHP 5.2.0 et versions ultérieures. Si vous utilisez une version plus ancienne, il y a aussi une bibliothèque PECL (cela dit, dans ce cas, vous devriez vraiment mettre à jour votre installation PHP. Le support de 5.1 a cessé en 2006.)


Conversion d'un array/ stdClass->stdClass

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

Conversion d'un array/ stdClass->array

Le manuel spécifie le deuxième argument de json_decode:

assoc
Quand TRUE, les objets retournés seront convertis en tableaux associatifs.

Par conséquent, la ligne suivante convertira l'intégralité de votre objet en un tableau:

$array = json_decode(json_encode($booking), true);
h2ooooooo
la source
1
Si (array) $booking;dans un var_dumpest NULL(comme écrit par OP), devinez ce que ce code renverra?
hakre
@hakre Il ne semble pas que ce soit NULLaprès l' avoir converti en tableau. Je pense que OP signifie que c'est NULLaprès utilisation, json_decode($array)ce qui est logique selon le manuel . NULL est retourné si le json ne peut pas être décodé
h2ooooooo
4
@AlessandroMinoccheri La raison pour laquelle cela n'a pas fonctionné avant était avant que vous ne l'utilisiez json_decode()sur un tableau. json_decodedoit être utilisé sur une chaîne JSON. Par conséquent, si nous le codons d'abord sous forme de chaîne JSON ( json_encode), puis le décodons (à l'aide de notre chaîne JSON), cela fonctionne correctement.
h2ooooooo
3
Est-ce que tout le monde a oublié que vous perdrez vos types qui ne sont pas définis dans la spécification JSON (dates par exemple)? Vous devrez alors avoir un réveil si vous utilisez cette approche. Ce n'est bon que si vous avez des types de base tels que des nombres, des chaînes et des booléens.
Denis Pshenov
1
Excellente réponse, je viens d'utiliser json_decode ($ stdClass, true);)
didando8a
68

utilisez cette fonction pour récupérer un tableau standard du type que vous recherchez ...

return get_object_vars($booking);
robzero
la source
19
Ce n'est pas récursif
gawpertron
17

Puisqu'il s'agit d'un tableau avant de le lancer, le lancer n'a aucun sens.

Vous voudrez peut-être une distribution récursive, qui ressemblerait à ceci:

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;
}

Usage:

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

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

Résultat avant:

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

Résultat après:

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

Remarque:

Testé et fonctionnant avec des tableaux complexes où un objet stdClass peut contenir d'autres objets stdClass.

Vlad Preda
la source
Génial. Fonctionne maintenant pour les objets stdClass qui contiennent des objets stdClass :)
Vlad Preda
14

Veuillez utiliser la fonction php suivante pour convertir php stdClass en tableau

get_object_vars($data)
Nalantha
la source
2
Notez que cette fonction n'est pas récursive. Reportez-vous à la réponse de Carlo Fontanos pour une solution récursive.
Courtney Miles
12

Utilisez la fonctionnalité de conversion de type intégrée, tapez simplement

$realArray = (array)$stdClass;
David Clews
la source
1
Je préfère cela à json_decode / encode, beaucoup plus propre +1
Logan
2
Cette méthode est plus propre, cependant, elle n'est pas non plus récursive et fonctionne de la même manière que get_object_vars (). Alors que la méthode json_decode / encode a la sensation d'un hack, elle fonctionne récursivement.
Debbie V
3

Juste googlé, et trouvé ici une fonction pratique qui est utile pour convertir récursivement l'objet stdClass en tableau.

<?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;
 }
}
?>

EDIT : J'ai mis à jour cette réponse avec du contenu provenant d'une source liée (qui est également modifié maintenant), merci à mason81 de m'avoir suggéré.

shasi kanth
la source
1
La prochaine fois, veuillez inclure le contenu pertinent de la source liée. Le lien que vous avez fourni a changé et est désormais hors de propos et inutile.
mason81
C'est ce que je cherchais, merci beaucoup.
0

Voici une version de la réponse de Carlo qui peut être utilisée en classe:

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
la source
0

Le code suivant lira tous les e-mails et imprimera le sujet, le corps et la date.

<?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);
?>

Cela génère les éléments suivants:

$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 

Ayant eu du mal avec diverses suggestions, j'ai utilisé des essais et des erreurs pour trouver cette solution. J'espère que ça aide.

walter1957
la source
0

Voici la meilleure fonction Object to Array que j'ai - fonctionne récursivement:

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
la source