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;
}
}
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.
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.)
array
stdClass
-> stdClass
$stdClass = json_decode(json_encode($booking));
array
/stdClass
-> array
Le manuel spécifie le deuxième argument de json_decode
comme:
_/assoc
(LorsqueTRUE
, 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);
utilisez cette fonction pour obtenir un tableau standard du type que vous recherchez ...
return get_object_vars($booking);
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.
Veuillez utiliser la fonction php suivante pour convertir php stdClass en tableau
get_object_vars($data)
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/
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é.
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.
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;
}
}