946 votes

Convertir un objet PHP en un tableau associatif

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.

1700voto

Gordon Points 156415

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 :

1 votes

Ha, et j'en ai déjà trouvé l'usage - voir ma réponse à la question suivante stackoverflow.com/questions/4352203/

3 votes

Considérez également le ArrayAccess peut-être en combinaison avec cette solution. php.net/manual/fr/class.arrayaccess.php

1 votes

Cela échouera si l'objet contient des sous-objets qui renvoient à l'objet que nous allons convertir. Cela provoquera une boucle infinie.

493voto

Jeff Standen Points 1396

Vous pouvez rapidement convertir des objets profondément imbriqués en tableaux associatifs en vous appuyant sur le comportement des fonctions d'encodage/décodage JSON :

$array = json_decode(json_encode($nested_object), true);

23 votes

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).

2 votes

BTW cette méthode ne semble plus fonctionner avec php 5.5, vous obtiendrez à nouveau un tableau d'objets.

16 votes

Respectueusement, je pense que cela fonctionne toujours... n'oubliez pas de mettre le 2ème paramètre à true.

94voto

Maurycy Zarzycki Points 884

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

19 votes

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.

18 votes

@SpYk3HH : écrire votre propre réponse ?

3 votes

Le premier résultat pour "php object to assoc array" est stackoverflow.com/questions/4345554/

68voto

ramonztro Points 555

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

0 votes

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 ?

0 votes

La seule solution que j'ai trouvée, qui fonctionnait avec des propriétés protégées. Merci

3 votes

La meilleure solution pour les variables privées et protégées !

20voto

Deepika Patel Points 26

Utilisez-le pour les tableaux multidimensionnels.

$array = json_decode(json_encode($objects),TRUE) ;

Prograide.com

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.

Powered by:

X