Nous avons deux objets PHP5 et aimerions fusionner le contenu de l'un dans le second. Il n'y a aucune notion de sous-classes entre elles, donc les solutions décrites dans la rubrique suivante ne peuvent pas s'appliquer.
Comment copiez-vous un objet PHP dans un autre type d'objet
//We have this:
$objectA->a;
$objectA->b;
$objectB->c;
$objectB->d;
//We want the easiest way to get:
$objectC->a;
$objectC->b;
$objectC->c;
$objectC->d;
Remarques:
- Ce sont des objets, pas des classes.
- Les objets contiennent beaucoup de champs, donc un foreach serait assez lent.
- Jusqu'à présent, nous envisageons de transformer les objets A et B en tableaux, puis de les fusionner à l'aide de array_merge () avant de les transformer à nouveau en un objet, mais nous ne pouvons pas dire que nous en sommes fiers.
Réponses:
Cela fonctionne également lorsque les objets ont des méthodes. (testé avec PHP 5.3 et 5.6)
la source
stdclass
. Bien qu'il "fonctionne" dans un sens sur les objets avec des méthodes, il ruine effectivement l'objet dans ce cas (en supprimant les méthodes).Vous pouvez créer un autre objet qui envoie des appels aux méthodes magiques aux objets sous-jacents. Voici comment vous le feriez
__get
, mais pour le faire fonctionner pleinement, vous devez remplacer toutes les méthodes magiques pertinentes. Vous trouverez probablement des erreurs de syntaxe puisque je viens de le saisir du haut de ma tête.Bonne chance.
la source
la source
$objectB
contient les données fusionnées.Je comprends que l'utilisation des objets génériques [stdClass ()] et leur conversion en tableaux répondent à la question, mais je pensais que le Compositeur était une excellente réponse. Pourtant, je pensais qu'il pourrait utiliser certaines améliorations de fonctionnalités et pourrait être utile pour quelqu'un d'autre.
Fonctionnalités:
Code:
Usage:
Exemple:
la source
foreach($objects as &$object) $this->with(&$object);
parforeach($objects as &$object) $this->with($object);
corrige le problème. Source: [ php.net/manual/en/language.references.pass.php]if($this->first_precedence) array_push($this->composite, &$object); else array_unshift($this->composite, &$object);
doit être remplacé parif($this->first_precedence) array_push($this->composite, $object); else array_unshift($this->composite, $object);
Une solution très simple si l'on considère les objets A et B:
C'est tout. Vous avez maintenant objA avec toutes les valeurs de objB.
la source
La
\ArrayObject
classe a la possibilité d' échanger le tableau actuel pour déconnecter la référence d' origine . Pour ce faire, il est livré avec deux méthodes pratiques:exchangeArray()
etgetArrayCopy()
. Le reste est tout simplement simplearray_merge()
de l'objet fourni avec lesArrayObject
propriétés publiques s:L'utilisation est aussi simple que cela:
la source
merge($array)
en demander un\ArrayObject
également.une solution Pour préserver, les méthodes et les propriétés des objets fusionnés consistent à créer une classe combinatoire
utilisation simple
la source
J'irais avec la liaison du deuxième objet dans une propriété du premier objet. Si le deuxième objet est le résultat d'une fonction ou d'une méthode, utilisez des références. Ex:
la source
Pour fusionner un nombre quelconque d'objets bruts
la source
Voici une fonction qui aplatira un objet ou un tableau. Utilisez-le uniquement si vous êtes sûr que vos clés sont uniques. Si vous avez des clés du même nom, elles seront écrasées. Vous devrez le placer dans une classe et remplacer "Fonctions" par le nom de votre classe. Prendre plaisir...
la source
Restons simples!
Si cela ne répond pas à votre question, cela aidera sûrement à la réponse. Le crédit pour le code ci-dessus me revient :)
la source
Cet extrait de code convertira récursivement ces données en un seul type (tableau ou objet) sans les boucles foreach imbriquées. J'espère que cela aide quelqu'un!
Une fois qu'un objet est au format tableau, vous pouvez utiliser array_merge et reconvertir en objet si vous en avez besoin.
Voie procédurale
Tout le mérite revient à: Jason Oakley
la source