Comment faire pour convertir un tableau d'objet en PHP?
Comment puis-je convertir un tableau comme ceci à l'objet?
[128] => Array ( [status] => la Figure A. Facebook horizontal de barres de défilement affiche sur un écran 1 024 x 768 de résolution. ) [129] => Array ( [status] => L'autre jour, au travail, j'avais un peu de temps libre ) )
- Quel type d'objet que vous souhaitez obtenir, précisément ? Ce que je veux dire, c'est : quelles devraient être les attributs ?
- $objet->état comme ça
- dans une boucle, il doit à la fois parce que le statut est un tableau de données, de sorte que les deux sont printet
- pas sûr de la date, mais cela fonctionne bien:
$a = (object)['hello' => 'world'];
Vous devez être connecté pour publier un commentaire.
Dans le cas le plus simple, c'est probablement suffisant pour "mouler" le tableau comme un objet:
Une autre option serait d'instancier une classe standard comme une variable, et la boucle dans votre tableau, tout en re-affectation de valeurs:
Comme Edson Médina souligné, vraiment propre solution est d'utiliser le haut-
json_
fonctions:Ce également (de manière récursive) permet de convertir tous vos sous des tableaux dans des objets, que vous pouvez ou ne souhaitez pas. Malheureusement, il a un 2-3x performances sur la boucle de la démarche.
Avertissement! (merci à Ultra pour le commentaire):
stdClass()
? Et que dire de la méthode json? Je doute que cela serait d'utiliser toute la classe définie par la structurex
dans le tableau contient une référence à un autre tableau. Puis$object->x
après l'exécution de votre one-liner sera un doublon de$array['x']
, n'est plus du tout une référence pour le tableau d'origine. Cela pourrait être inoffensifs dans certaines applications, mais pour les grandes matrices de gaspiller de la mémoire et pourrait gâcher l'exécution si la référence est utilisée plus tard.$obj->(3)
donne une erreur. Au lieu d'utiliser une variable$obj->$foo
où$foo=3
ou$foo=(3)
ou$foo="3"
. Toutes les oeuvres !$obj->(3)
est une erreur de syntaxe. J'ai littéralement juste maintenant couru un exemple en php 7.3 pour afficher le point, et il ne s'en fait. Aussi, votre$obj->$foo
n'est pas une bonne façon de l'écrire parce que cela implique une variable dynamique, qui, tout en équivalent, est difficile à lire et à comprendre. ne pas le faire (à mon humble avis)vous pouvez simplement utiliser le type coulée de convertir un tableau d'objet.
Rapide hack:
Pas assez, mais les œuvres.
$this
dans les commentaires qui suivent que l'accesseur il est fortement implicite qu'il/elle le désire unstdClass
instance de la production et non pas une classe définie par l'utilisateur, telles que votre réponse utilise. Je suis d'accord sur l'élégance de cette solution, mais malheureusement, il est assez couramment employée modèle de résoudre ce problème avec des tableaux imbriqués où casting pour objet de ne pas travailler. Il est également possible que l'OP est à l'aide d'une interface qui nécessite et de l'objet en entrée et pas un tableau.Le moyen le plus facile serait
Mais ce n'est pas ce que vous voulez. Si vous souhaitez que les objets que vous voulez réaliser quelque chose, mais ce qui manque à cette question. À l'aide d'objets juste pour la raison de l'utilisation des objets n'a pas de sens.
Voici trois façons:
Faux un objet réel:
Convertir le tableau en un objet par moulage d'un objet:
Manuellement convertir le tableau en objet:
Sa façon de simple, Cela va créer un objet pour les tableaux:
false
àjson_decode()
va retourner un tableau associatif.true
àjson_decode
va retourner un tableau associatif,false
est la valeur par défaut et sera de retour uneStdClass
instance.Selon l'endroit où vous avez besoin et comment accéder à l'objet il y a différentes façons de le faire.
Par exemple: il suffit de transtypage il
Cependant, le plus compatible est d'utiliser un utilitaire de méthode (pas encore partie de PHP) qui implémente le standard de PHP casting basé sur une chaîne qui spécifie le type (ou en l'ignorant juste de références de la valeur):
L'exemple d'utilisation dans votre cas (Démo En Ligne):
Il n'y a pas de méthode intégrée de le faire autant que je suis au courant, mais c'est aussi simple que d'une simple boucle:
Vous pouvez préciser si vous en avez besoin pour construire votre objet de manière récursive.
Ce a travaillé pour moi
utilisation :
retourne :
comme d'habitude, vous pouvez faire une boucle comme:
$obj = (object) $array;
ne fonctionne pas pour les tableaux multidimensionnels.En fait, si vous voulez l'utiliser avec des multi-dimensions des tableaux que vous souhaitez utiliser certaines de récursivité.
Vous pouvez utiliser l' (objet) de la fonction de convertir votre tableau dans un objet.
Le résultat sera un objet qui contient des tableaux:
Je serais certainement aller avec une méthode propre comme ceci :
si vous soumettez:
vous obtiendrez ceci:
J'ai trouvé cela plus logique de comparer les réponses ci-dessus, à partir d'Objets doit être utilisé pour le but qu'ils ont été faits pour (encapsulated mignons petits objets).
Également à l'aide de get_object_vars de s'assurer qu'aucun des attributs supplémentaires sont créés dans l'Objet manipulé (vous ne voulez pas d'une voiture ayant un nom de famille, ni une personne à se comporter de 4 roues).
Vous pouvez également utiliser un ArrayObject, par exemple:
la récursivité est votre ami:
Celui que j'utilise (c'est un membre de la classe):
Peu compliqué, mais facile à étendre technique:
Supposons que vous disposez d'un tableau
Supposons que vous avez une classe de Personne qui peut avoir plus ou moins les attributs de ce tableau. par exemple
Si vous voulez changer votre tableau à l'objet de personne. Vous pouvez utiliser ArrayIterator Classe.
Maintenant, vous avez itérateur objet.
Créer une classe étendant FilterIterator Classe; où vous devez définir la méthode abstraite accepter. Suivez l'exemple
Ci-dessus impelmentation va lier la propriété seulement si il existe dans la classe.
Ajouter une méthode dans la classe PersonIterator
Assurez-vous d'avoir des mutateurs définis dans votre classe.
Maintenant, vous êtes prêt à appeler ces fonction de l'endroit où vous souhaitez créer l'objet.
utiliser cette fonction que j'ai fait:
Utilisation:
Cela nécessite PHP7 parce que j'ai choisi d'utiliser une fonction lambda pour verrouiller loin de la 'innerfunc" au sein de la fonction principale. Le lambda de la fonction est appelée récursivement, d'où la nécessité d': "utilisation ( &$innerfunc )". Vous pourriez le faire en PHP5 mais ne pouvait pas cacher la innerfunc.
Facile:
Exemple:
Ensuite, la suivante est vraie:
un liner
x
dans le tableau contient une référence à un autre tableau. Puis$object->x
après l'exécution de votre one-liner sera un doublon de$result_array['x']
, pas l'identique tableau.Vous pourriez aussi le faire par l'ajout de (objet) sur la gauche de la variable à créer un nouvel objet.
http://codepad.org/9YmD1KsU
À l'aide de
json_encode
est problématique en raison de la façon dont il gère non des données UTF-8. Il est intéressant de noter que lajson_encode
/json_encode
méthode aussi des feuilles non-tableaux associatifs que des tableaux. Cela peut ou peut ne pas être ce que vous voulez. J'étais récemment dans la position d'avoir besoin de recréer les fonctionnalités de cette solution mais sans l'aide dejson_
fonctions. Voici ce que j'ai trouvé:Meilleure Méthode du MONDE 🙂
si vous utilisez de différentes méthodes, vous aurez des problèmes. C'est la meilleure méthode. Vous avez jamais vu.
CakePHP dispose d'un Ensemble récursif::map de la classe qui, en gros, les cartes d'un tableau dans un objet. Vous devrez peut-être modifier le tableau ressemble afin de rendre l'objet à examiner la façon dont vous le voulez.
http://api.cakephp.org/view_source/set/#line-158
Pire des cas, vous pourriez être en mesure d'obtenir quelques idées à partir de cette fonction.
Évidemment juste une extrapolation de quelques autres gens de réponses, mais voici la fonction récursive qui permettra de convertir n'importe quel paillis-dimensions tableau en objet:
Et n'oubliez pas que si le tableau avait des touches numériques, ils peuvent encore être référencé dans le résultat de l'objet à l'aide de
{}
(par exemple:$obj->prop->{4}->prop
)Inspiré par tous ces codes, j'ai essayé de créer une version améliorée avec le soutien de: nom de classe spécifique, éviter la méthode constructeur, 'beans' motif et le mode strict (uniquement définir les propriétés existantes):
Code
Cette fonction fonctionne comme même que
json_decode(json_encode($arr), false)
.Tests
Test 1: tableau Plat
De sortie:
Test 2: Tableau d'objets
De sortie:
Test 3: Objet
De sortie:
Tableaux multidimensionnels dans un objet. ce code est utilisé pour la conversion du moteur de recherche Bing API try et catch méthode.
Vous pouvez utiliser la Réflexion:
je l'ai fait avec assez moyen simple,
En utilisant (array) et (objet) en tant que préfixe, vous pouvez simplement convertir un tableau d'objets de gamme standard et vice-verset
J'utilise la suite pour analyser les fichiers Yaml tableaux associatifs dans un état de l'objet.
Celui-ci vérifie tous fourni des tableaux si il y a des objets cachés, et les transforme aussi en objets.
Cela s'avère un yaml configuré comme
à un tableau constitué de:
à un objet de: