web-dev-qa-db-fra.com

php stdClass au tableau

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 ma tentative de distribution, il est vide ..__ Comment convertir/convertir sans supprimer ses lignes?

tableau avant la distribution:

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

après la distribution est vide NULL si j'essaie de créer une var_dump($booking);

J'ai aussi 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;
        }
    }
155

La méthode lazy one-liner

Vous pouvez le faire de manière linéaire en utilisant les méthodes JSON si vous êtes prêt à perdre un peu de performance (bien que certains aient signalé que cela était plus rapide que de parcourir les objets de manière récursive - probablement parce que PHP est lent à appeler des fonctions ). "Mais je l'ai déjà fait} _" dites-vous. Pas exactement - vous avez utilisé json_decode sur le tableau, mais vous devez l'encoder avec json_encode first.

Exigences

Les méthodes json_encode et json_decode . Ceux-ci sont automatiquement regroupés dans PHP 5.2.0 et versions ultérieures. Si vous utilisez une version plus ancienne, il existe également une bibliothèque PECL (cela dit, dans ce cas, vous devriez vraiment mettre à jour votre installation PHP. La prise en charge de la version 5.1 a cessé en 2006.)


Conversion d'une arraystdClass -> stdClass

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

Conversion d'une array/stdClass -> array

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

_/assoc
(Lorsque TRUE, les objets retournés seront convertis en tableaux associatifs.} _

Par conséquent, la ligne suivante convertira votre objet entier en tableau:

$array = json_decode(json_encode($booking), true);
351
h2ooooooo

utilisez cette fonction pour obtenir un tableau standard du type que vous recherchez ... 

return get_object_vars($booking);
59
robzero

Comme c'est 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;
}

Utilisation:

$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 utilisation de tableaux complexes dans lesquels un objet stdClass peut contenir d'autres objets stdClass.

16
Vlad Preda

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

get_object_vars($data)
13
Nalantha

Cette fonction a fonctionné pour moi: 

function cvf_convert_object_to_array($data) {

    if (is_object($data)) {
        $data = get_object_vars($data);
    }

    if (is_array($data)) {
        return array_map(__FUNCTION__, $data);
    }
    else {
        return $data;
    }
}

Référence: http://carlofontanos.com/convert-stdclass-object-to-array-in-php/

11
Carlo Fontanos

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

<?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 de source liée (qui a également changé maintenant), merci à mason81 de me l'avoir suggéré.

4
shasi kanth

Le code suivant lira tous les courriels 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 lutté avec diverses suggestions, j'ai utilisé trial & error pour proposer cette solution. J'espère que ça aide.

0
walter1957

Voici une version de la réponse de Carlo qui peut être utilisée dans une 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;
    }
}
0
Loren