490 votes

Comment convertir un tableau en objet en PHP ?

Comment puis-je convertir un tableau comme celui-ci en objet ?

[128] => Array
    (
        [status] => "Figure A.
 Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution."
    )

[129] => Array
    (
        [status] => "The other day at work, I had some spare time"
    )

4 votes

Quel type d'objet voulez-vous obtenir, précisément ? Ce que je veux dire, c'est : quels doivent être les attributs ?

0 votes

Dans une boucle, il devrait y avoir les deux car le statut est un seul tableau de données, donc les deux sont imprimés

3 votes

Je ne sais pas depuis quand, mais ça marche : $a = (object)['hello' => 'world'];

804voto

jlb Points 4079

Dans le cas le plus simple, il est probablement suffisant de "couler" le tableau comme un objet :

$object = (object) $array;

Une autre option serait d'instancier une classe standard en tant que variable, et de boucler votre tableau tout en réassignant les valeurs :

$object = new stdClass();
foreach ($array as $key => $value)
{
    $object->$key = $value;
}

Comme Edson Medina a souligné, une solution vraiment propre est d'utiliser le module intégré json_ fonctions :

$object = json_decode(json_encode($array), FALSE);

Cela convertit aussi (récursivement) tous vos sous-réseaux en objets, ce que vous pouvez ou non vouloir. Malheureusement, cette méthode a un coût de 2-3x performance atteinte par rapport à l'approche en boucle.

Attention ! (merci à Ultra pour le commentaire) :

json_decode sur différents environnements convertit les données UTF-8 de différentes manières. Je finis par obtenir les valeurs '240.00' localement et '240' en production - un vrai désastre. De plus, si la conversion échoue, la chaîne est retournée comme NULL.

46 votes

"comme les variables ne peuvent pas commencer par des nombres", oui ils peuvent : $object->{3} = 'xyz' ;

13 votes

"Ce qui est une comparaison injuste, car cette dernière méthode renvoie des objets récursifs, tandis que l'approche en boucle sans autres conditions (comme dans la réponse de @streetparade) ne convertit que le premier niveau.

10 votes

@feeela Je ne pense pas que ce soit injuste du tout J'ai mentionné qu'il fait la conversion récursivement. De plus, le gain de performance de 2 à 3 fois a été obtenu en utilisant un tableau d'entrée plat (qui n'utiliserait aucune récursion).

180voto

Shahbaz Points 621

Vous pouvez simplement utiliser le type casting pour convertir un tableau en objet.

// *convert array to object* Array([id]=> 321313[username]=>shahbaz)
$object = (object) $array_name;

//now it is converted to object and you can access it.
echo $object->username;

0 votes

Vous êtes le vrai héros.

166voto

johannes Points 8057

Le moyen le plus simple serait

$object = (object)$array;

Mais ce n'est pas ce que vous voulez. Si vous voulez des objets, vous voulez atteindre quelque chose, mais ce n'est pas le cas dans cette question. Utiliser des objets juste pour la raison d'utiliser des objets n'a aucun sens.

2 votes

Ne fonctionne pas, je l'ai fait avant de poser la question ici donc il doit y avoir un autre moyen de le faire

30 votes

Pourquoi doit-il donner sa raison de vouloir utiliser des objets ? Je ne pense pas que ce soit pertinent pour comment c'est fait. Peut-être qu'il a besoin de les encoder en json, ou de les sérialiser ? Il pourrait y avoir des dizaines de raisons de faire cela.

0 votes

Hmm j'ai regardé la sortie du navigateur, cela ressemble à ceci object(stdClass)#150 (130) {[0]=> array(1) { ["status"]=> string(130) "Enfin, les utilisateurs de Mac et Linux n'ont pas à se sentir comme des citoyens de seconde classe au pays de Chrome : ils ont la version beta officielle ". } Officiellement, il s'agit d'un objet, mais comment faire pour itérer et accéder au statut comme $obj->status ?

126voto

Edson Medina Points 2555

Un hack rapide :

// assuming $var is a multidimensional array
$obj = json_decode (json_encode ($var), FALSE);

Pas très joli, mais ça marche.

2 votes

En fait, j'adore cette solution. Utiliser des fonctions intégrées au lieu de fonctions définies par l'utilisateur est toujours plus rapide, et celle-ci fonctionne parfaitement. Merci pour l'astuce.

0 votes

@Oddant Cela résout le problème mentionné ci-dessus (convertir un tableau en objet). Votre diatribe devrait être dirigée vers le message principal, pas vers ma solution.

0 votes

@EdsonMedina Je l'ai fait, mais mon message est beaucoup trop bas.

106voto

Julius F Points 1468

Voici trois façons de le faire :

  1. Faux un objet réel :

    class convert
    {
        public $varible;
    
        public function __construct($array)
        {
            $this = $array;
        }
    
        public static function toObject($array)
        {
            $array = new convert($array);
            return $array;
        }
    }
  2. Convertir le tableau en un objet en le coulant dans un objet :

    $array = array(
        // ...
    );
    $object = (object) $array;
  3. Convertir manuellement le tableau en objet :

    $object = object;
    foreach ($arr as $key => $value) {
        $object->{$key} = $value;
    }

2 votes

Hmm merci mais votre classe face donne l'erreur suivante Erreur fatale : Cannot re-assign $this in /var/www/bot/inc/twitter-bot.php on line 10

1 votes

Et typcasint @ référence n'est pas une bonne idée, même si cela ne fonctionne pas voici ce que j'ai obtenu T_OBJECT_CAST inattendu, s'attendant à T_NEW ou T_STRING ou T_VARIABLE ou '$'.

0 votes

Je suis désolé, oui c'était évident qu'il n'a pas encore été testé, mais j'ai pensé "donner une réponse rapide et brève", la prochaine fois je passerai plus de temps dans les tests ;) Je poursuivrai les tests sur le casting lorsque je passerai à la version 5.3.1 de PHP.

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