J'intègre à mon site Web une API qui fonctionne avec des données stockées dans des objets, alors que mon code est écrit avec des tableaux.
J'aimerais une fonction rapide pour convertir un objet en tableau.
J'intègre à mon site Web une API qui fonctionne avec des données stockées dans des objets, alors que mon code est écrit avec des tableaux.
J'aimerais une fonction rapide pour convertir un objet en tableau.
Il suffit de le cataloguer.
$array = (array) $yourObject;
De Tableaux :
Si un objet est converti en tableau, le résultat est un tableau dont les éléments sont les propriétés de l'objet. Les clés sont les noms des variables membres, avec quelques exceptions notables : les propriétés entières sont inaccessibles ; les variables privées ont le nom de la classe en préambule au nom de la variable ; les variables protégées ont un '*' en préambule au nom de la variable. Ces valeurs précédées ont des octets nuls de chaque côté.
Exemple : Objet simple
$object = new StdClass;
$object->foo = 1;
$object->bar = 2;
var_dump( (array) $object );
Salida:
array(2) {
'foo' => int(1)
'bar' => int(2)
}
Exemple : Objet complexe
class Foo
{
private $foo;
protected $bar;
public $baz;
public function __construct()
{
$this->foo = 1;
$this->bar = 2;
$this->baz = new StdClass;
}
}
var_dump( (array) new Foo );
Sortie (avec \0s modifié pour plus de clarté) :
array(3) {
'\0Foo\0foo' => int(1)
'\0*\0bar' => int(2)
'baz' => class stdClass#2 (0) {}
}
_Sortie avec var_export
au lieu de var_dump
:_
array (
'' . "\0" . 'Foo' . "\0" . 'foo' => 1,
'' . "\0" . '*' . "\0" . 'bar' => 2,
'baz' =>
stdClass::__set_state(array(
)),
)
Le typecasting de cette façon n'effectuera pas un casting profond du graphe de l'objet et vous devrez appliquer les octets nuls (comme expliqué dans la citation du manuel) pour accéder à tout attribut non public. Cette méthode est donc plus efficace pour le casting d'objets StdClass ou d'objets ayant uniquement des propriétés publiques. Pour un travail rapide et sale (ce que vous avez demandé), c'est parfait.
Voir également cet article de blog approfondi :
Ha, et j'en ai déjà trouvé l'usage - voir ma réponse à la question suivante stackoverflow.com/questions/4352203/
Considérez également le ArrayAccess
peut-être en combinaison avec cette solution. php.net/manual/fr/class.arrayaccess.php
Cela échouera si l'objet contient des sous-objets qui renvoient à l'objet que nous allons convertir. Cela provoquera une boucle infinie.
C'est la meilleure solution si vous voulez une conversion récursive en profondeur (et bien sûr si vous n'êtes pas gêné par les mauvaises performances).
BTW cette méthode ne semble plus fonctionner avec php 5.5, vous obtiendrez à nouveau un tableau d'objets.
Respectueusement, je pense que cela fonctionne toujours... n'oubliez pas de mettre le 2ème paramètre à true.
Dès le premier résultat de Google pour " Objet PHP pour assoc array " nous avons ceci :
function object_to_array($data)
{
if (is_array($data) || is_object($data))
{
$result = [];
foreach ($data as $key => $value)
{
$result[$key] = (is_array($value) || is_object($value)) ? object_to_array($value) : $value;
}
return $result;
}
return $data;
}
La source est à codesnippets.joyent.com .
Pour le comparer à la solution de json_decode & json_encode
celui-ci semble plus rapide. Voici un benchmark aléatoire (en utilisant le mesure simple du temps ):
$obj = (object) [
'name' =>'Mike',
'surname' =>'Jovanson',
'age' =>'45',
'time' =>1234567890,
'country' =>'Germany',
];
##### 100 000 cycles ######
* json_decode(json_encode($var)) : 4.15 sec
* object_to_array($var) : 0.93 sec
Personnellement, je n'aime pas l'idée de rappeler la fonction pour chaque valeur. J'ai une version similaire, mais en 3 lignes : function objectToArray($o) { $a = array(); foreach ($o as $k => $v) $a[$k] = (is_array($v) || is_object($v)) ? objectToArray($v): $v; return $a; }
Cela permet de définir tout ce qui n'est pas un objet ou un tableau et de continuer sans rappeler la méthode, sauf si nécessaire.
Le premier résultat pour "php object to assoc array" est stackoverflow.com/questions/4345554/
Si les propriétés de votre objet sont publiques, vous pouvez le faire :
$array = (array) $object;
S'ils sont privés ou protégés, ils auront des noms de clés bizarres dans le tableau. Donc, dans ce cas, vous aurez besoin de la fonction suivante :
function dismount($object) {
$reflectionClass = new ReflectionClass(get_class($object));
$array = array();
foreach ($reflectionClass->getProperties() as $property) {
$property->setAccessible(true);
$array[$property->getName()] = $property->getValue($object);
$property->setAccessible(false);
}
return $array;
}
Si votre propriété est protégée, setAccessible(false) lui redonnera-t-il une visibilité protégée ou la rendra-t-elle privée ?
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.