J'intègre une API à mon site Web qui fonctionne avec des données stockées dans des objets pendant que mon code est écrit à l'aide de tableaux.
J'aimerais une fonction rapide et sale pour convertir un objet en un tableau.
Il suffit de le transcrire
$array = (array) $yourObject;
Depuis les 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, à quelques exceptions notables près: les propriétés entières sont inaccessibles; les variables privées ont le nom de classe ajouté au nom de la variable; les variables protégées ont un '*' ajouté au nom de la variable. Ces valeurs ajouté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 );
Production:
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 édité 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 transtypage de cette manière ne fera pas de transtypage en profondeur du graphique d'objet et vous devez appliquer les octets nuls (comme expliqué dans le devis manuel) pour accéder à tous les attributs non publics. Cela fonctionne donc mieux lors de la conversion d'objets StdClass ou d'objets avec uniquement des propriétés publiques. Pour rapide et sale (ce que vous avez demandé) c'est bien.
Consultez également cet article de blog détaillé:
ArrayAccess
interface, peut-être en combinaison avec cette solution. php.net/manual/en/class.arrayaccess.php[1 => "one"]
devient["1" => "one"]
(array)
et(object)
fonctionne de manière fiable et identique sur toutes les versions depuis PHP 4.3. Voir 3v4l.org/X6lhm . Si vous obtenez une erreur de syntaxe, vous avez fait quelque chose de mal.empty
. Vous ne pouvez pas utiliser une expressionempty
antérieure à 5.5. Cela n'a rien à voir avec le transtypage;)Vous pouvez rapidement convertir des objets profondément imbriqués en tableaux associatifs en s'appuyant sur le comportement des fonctions d'encodage / décodage JSON:
la source
Du premier coup de Google pour " objet PHP à tableau d'assoc ", nous avons ceci:
La source est à codesnippets.joyent.com .
la source
function objectToArray($o) { $a = array(); foreach ($o as $k => $v) $a[$k] = (is_array($v) || is_object($v)) ? objectToArray($v): $v; return $a; }
cela définit simplement tout ce qui n'est pas un objet ou un tableau et continue sans rappel répétitif de la méthode, sauf si cela est nécessaire.Si vos propriétés d'objet sont publiques, vous pouvez:
S'ils sont privés ou protégés, ils auront des noms de clés étranges sur la baie. Donc, dans ce cas, vous aurez besoin de la fonction suivante:
la source
Production
la source
Voici du code:
la source
Toutes les autres réponses publiées ici ne fonctionnent qu'avec des attributs publics. Voici une solution qui fonctionne avec des objets de type JavaBeans en utilisant la réflexion et les getters:
la source
public
propriétés?Qu'en est-il de
get_object_vars($obj)
? Cela semble utile si vous ne souhaitez accéder qu'aux propriétés publiques d'un objet.Voir get_object_vars .
la source
Tapez cast votre objet dans un tableau.
Cela résoudra votre problème.
la source
Tout d'abord, si vous avez besoin d'un tableau à partir d'un objet, vous devez probablement constituer les données en tant que tableau en premier. Pensez-y.
N'utilisez pas de
foreach
instruction ou des transformations JSON. Si vous planifiez cela, vous travaillez à nouveau avec une structure de données, pas avec un objet.Si vous en avez vraiment besoin, utilisez une approche orientée objet pour avoir un code propre et maintenable. Par exemple:
Objet en tant que tableau
Si vous avez besoin de toutes les propriétés, utilisez un objet de transfert:
la source
Vous pouvez facilement utiliser cette fonction pour obtenir le résultat:
Utilisez PHP 5 ou une version ultérieure.
la source
Voici ma fonction PHP récursive pour convertir des objets PHP en un tableau associatif:
Exemple d'utilisation:
la source
$new_arr1 = (array) $my_object;
Pour convertir un objet en tableau, convertissez-le simplement explicitement:
la source
Vous pouvez également créer une fonction en PHP pour convertir un tableau d'objets:
la source
Vous pouvez le faire lorsque vous obtenez des données en tant qu'objets à partir de bases de données:
la source
Fonction personnalisée pour convertir stdClass en un tableau:
Une autre fonction personnalisée pour convertir Array en stdClass:
Exemple d'utilisation:
la source
Utilisation:
Il renvoie un tableau sans caractères spéciaux ni noms de classe.
la source
Cette réponse n'est que l'union des différentes réponses de ce post, mais c'est la solution pour convertir un objet PHP avec des propriétés publiques ou privées avec des valeurs simples ou des tableaux en un tableau associatif ...
la source
Quelques améliorations du code "bien connu"
Notez que si la fonction est membre d'une classe (comme ci-dessus), vous devez passer
__FUNCTION__
à__METHOD__
la source
Vous pouvez également utiliser le composant Symfony Serializer
la source
Pour votre cas, c'était bien / beau si vous utilisiez les modèles "décorateur" ou "transformation du modèle de date". Par exemple:
Votre modèle
Décorateur
Usage
Ce sera donc un code plus beau et plus correct.
la source
Conversion et suppression d'étoiles ennuyeuses:
Ce sera probablement moins cher que d'utiliser des réflexions.
la source
Solution courte de @ SpYk3HH
la source
Étant donné que beaucoup de gens trouvent cette question en raison de problèmes avec l'accès dynamique aux attributs d'un objet, je soulignerai simplement que vous pouvez le faire en PHP:
$valueRow->{"valueName"}
Dans le contexte (sortie HTML supprimée pour plus de lisibilité):
la source
En utilisant le transtypage, vous pouvez résoudre votre problème. Ajoutez simplement les lignes suivantes à votre objet de retour:
Vous pouvez également y ajouter une nouvelle paire clé / valeur en utilisant:
la source
Je pense que c'est une bonne idée d'utiliser des traits pour stocker la logique de conversion objet-tableau. Un exemple simple:
la source
la source
Ici, j'ai créé une méthode objectToArray () , qui fonctionne également avec des objets récursifs, comme lorsque
$objectA
contient$objectB
qui pointe à nouveau vers$objectA
.De plus, j'ai limité la sortie aux propriétés publiques à l'aide de ReflectionClass. Débarrassez-vous-en, si vous n'en avez pas besoin.
Pour identifier les objets déjà utilisés, j'utilise une propriété protégée dans cette classe (abstraite), nommée
$this->usedObjects
. Si un objet imbriqué récursif est trouvé, il sera remplacé par la chaîne**recursive**
. Sinon, il échouerait à cause de la boucle infinie.la source
$usedObjects
n'est pas initialisé au début, donc l'appeler plusieurs fois donnera des résultats incorrects dans les appels ultérieurs. De plus, vous ne le libérez pas à la fin, donc vos objets ne seront jamais supprimés de la mémoire.Il y a ma proposition, si vous avez des objets dans des objets avec même des membres privés:
la source
J'utilise ceci (solution récursive nécessaire avec les clés appropriées):
Exemple d'utilisation, le code suivant:
Imprime ceci:
la source