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
)
$a = (object)['hello' => 'world'];
Réponses:
Dans le cas le plus simple, il suffit probablement de «transtyper» le tableau en objet:
Une autre option serait d'instancier une classe standard en tant que variable et de parcourir votre tableau tout en réaffectant les valeurs:
Comme l'a souligné Edson Medina , une solution vraiment propre consiste à utiliser les
json_
fonctions intégrées:Cela convertit également (récursivement) tous vos sous-tableaux en objets, que vous souhaitiez ou non. Malheureusement, ses performances sont de 2 à 3 fois supérieures à l'approche en boucle.
Attention! (merci à Ultra pour le commentaire):
la source
x
du tableau contient une référence à un autre tableau. Ensuite,$object->x
après l'exécution de votre one-liner, il y aura un double de$array['x']
, et non plus une référence au tableau d'origine. Cela peut être inoffensif dans certaines applications, mais pour les grands tableaux, cela gaspille de la mémoire et peut gâcher l'exécution si la référence est utilisée plus tard.vous pouvez simplement utiliser la conversion de type pour convertir un tableau en objet.
la source
La manière la plus simple serait
Mais ce n'est pas ce que tu veux. Si vous voulez des objets, vous voulez réaliser quelque chose, mais cela manque dans cette question. L'utilisation d'objets uniquement pour la raison de l'utilisation d'objets n'a aucun sens.
la source
Piratage rapide:
Pas joli, mais ça marche.
la source
$this
dans les commentaires qui suivent comme accesseur, il est fortement implicite qu'il / elle désire unestdClass
instance en sortie et non une classe définie par l'utilisateur telle que votre réponse utilise. Je suis d'accord sur l'élégance de cette solution, mais malheureusement, c'est un modèle assez couramment utilisé pour résoudre ce problème avec les tableaux imbriqués où la conversion en objet ne fonctionnera pas. Il est également possible qu'OP utilise une interface qui requiert et objecte en entrée et non un tableau.Voici trois façons:
Faux un vrai objet:
Convertissez le tableau en objet en le convertissant en objet:
Convertissez manuellement le tableau en objet:
la source
Son chemin vers le simple, cela créera également un objet pour les tableaux récursifs:
la source
false
àjson_decode()
renverra un tableau associatif.true
àjson_decode
retournera un tableau associatif,false
est la valeur par défaut et retournera uneStdClass
instance.Selon l'endroit où vous en avez besoin et comment accéder à l'objet, il existe différentes façons de le faire.
Par exemple: il suffit de le transcrire
Cependant, la plus compatible utilise une méthode utilitaire (qui ne fait pas encore partie de PHP) qui implémente la conversion PHP standard basée sur une chaîne qui spécifie le type (ou en l'ignorant simplement en dé-référençant la valeur):
L'exemple d'utilisation dans votre cas ( démo en ligne ):
la source
Celui-ci a fonctionné pour moi
utilisation:
Retour :
comme d'habitude, vous pouvez le boucler comme:
la source
$obj = (object) $array;
ne fonctionne pas pour les tableaux multidimensionnels.Il n'y a pas de méthode intégrée pour le faire pour autant que je sache, mais c'est aussi simple qu'une simple boucle:
Vous pouvez l'exposer si vous en avez besoin pour construire votre objet de manière récursive.
la source
Vous pouvez utiliser la fonction (objet) pour convertir votre tableau en objet.
Le résultat sera un objet qui contient des tableaux:
la source
En fait, si vous souhaitez utiliser cela avec des tableaux multidimensionnels, vous voudrez utiliser une récursivité.
la source
J'irais certainement avec une manière propre comme ceci:
si vous soumettez:
vous obtiendrez ceci:
J'ai trouvé cela plus logique en comparant les réponses ci-dessus des objets devraient être utilisées dans le but pour lequel elles ont été faites (petits objets mignons encapsulés).
L'utilisation de get_object_vars garantit également qu'aucun attribut supplémentaire n'est créé dans l'objet manipulé (vous ne voulez pas d'une voiture ayant un nom de famille, ni d'une personne se comportant à 4 roues).
la source
Vous pouvez également utiliser un ArrayObject, par exemple:
la source
Celui que j'utilise (c'est un membre de la classe):
la source
Technique peu compliquée mais facile à étendre:
Supposons que vous ayez un tableau
Supposons que vous ayez une classe Person qui peut avoir plus ou moins d'attributs de ce tableau. par exemple
Si vous voulez toujours changer votre tableau en objet personne. Vous pouvez utiliser la classe ArrayIterator.
Vous avez maintenant un objet itérateur.
Créez une classe étendant la classe FilterIterator; où vous devez définir la méthode abstraite accepter. Suivre l'exemple
L'impelmentation ci-dessus ne liera la propriété que si elle existe dans la classe.
Ajoutez une méthode de plus dans la classe PersonIterator
Assurez-vous que des mutateurs sont définis dans votre classe. Vous êtes maintenant prêt à appeler ces fonctions à l'endroit où vous souhaitez créer un objet.
la source
la récursivité est votre amie:
la source
Cela nécessite PHP7 car j'ai choisi d'utiliser une fonction lambda pour verrouiller le 'innerfunc' dans la fonction principale. La fonction lambda est appelée récursivement, d'où la nécessité de: "use (& $ innerfunc)". Vous pouvez le faire en PHP5 mais ne pouvez pas masquer le module interne.
la source
utilisez cette fonction que j'ai faite:
Usage:
la source
bon mot
la source
x
du tableau contient une référence à un autre tableau. Ensuite,$object->x
après l'exécution de votre one-liner sera un doublon de$result_array['x']
, pas le tableau identique.Facile:
Exemple:
Ensuite, ce qui suit est vrai:
la source
Vous pouvez également le faire en ajoutant (objet) à gauche de la variable pour créer un nouvel objet.
http://codepad.org/9YmD1KsU
la source
L'utilisation
json_encode
est problématique en raison de la façon dont elle gère les données non UTF-8. Il convient de noter que la méthodejson_encode
/json_encode
laisse également les tableaux non associatifs en tant que tableaux. Cela peut ou non être ce que vous voulez. J'étais récemment dans la position de devoir recréer les fonctionnalités de cette solution mais sans utiliser dejson_
fonctions. Voici ce que j'ai trouvé:la source
Meilleure méthode au monde :)
si vous utilisez des méthodes différentes, vous aurez des problèmes. C'est la meilleure méthode. Vous avez déjà vu.
la source
Tableaux multidimensionnels dans un objet. ce code est utilisé pour la conversion de la méthode try et catch de l'API de recherche Bing.
la source
Vous pouvez utiliser la réflexion:
la source
CakePHP a une classe Set :: map récursive qui mappe fondamentalement un tableau dans un objet. Vous devrez peut-être modifier l'apparence du tableau afin de donner à l'objet l'apparence souhaitée.
http://api.cakephp.org/view_source/set/#line-158
Dans le pire des cas, vous pourrez peut-être obtenir quelques idées de cette fonction.
la source
Évidemment, juste une extrapolation des réponses d'autres personnes, mais voici la fonction récursive qui convertira tout tableau à paillis en objet:
Et rappelez - vous que si le tableau avait des touches numériques , ils peuvent être référencés encore l'objet résultant à l'aide
{}
(par exemple:$obj->prop->{4}->prop
)la source
Inspiré par tous ces codes, j'ai essayé de créer une version améliorée avec le support de: nom de classe spécifique, éviter la méthode constructeur, le modèle 'beans' et le mode strict (définir uniquement les propriétés existantes):
la source
Code
Cette fonction fonctionne de la même manière que
json_decode(json_encode($arr), false)
.Essai
Test 1: réseau plat
Production:
Test 2: tableau d'objets
Production:
Test 3: objet
Production:
la source
je l'ai fait de manière assez simple,
la source