Wir haben zwei PHP5-Objekte und möchten den Inhalt von einem in das zweite zusammenführen. Es gibt keine Vorstellung von Unterklassen zwischen ihnen, daher können die im folgenden Thema beschriebenen Lösungen nicht angewendet werden.
Wie kopiert man ein PHP-Objekt in einen anderen Objekttyp?
//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;
Bemerkungen:
- Dies sind Objekte, keine Klassen.
- Die Objekte enthalten ziemlich viele Felder, so dass ein Foreach ziemlich langsam wäre.
- Bisher ziehen wir in Betracht, die Objekte A und B in Arrays umzuwandeln und sie dann mit array_merge () zusammenzuführen, bevor wir sie erneut in ein Objekt umwandeln. Wir können jedoch nicht sagen, dass wir stolz darauf sind.
Antworten:
Dies funktioniert tatsächlich auch, wenn Objekte Methoden haben. (getestet mit PHP 5.3 und 5.6)
quelle
stdclass
. Während es in gewissem Sinne bei Objekten mit Methoden "funktioniert", ruiniert es in diesem Fall das Objekt effektiv (durch Entfernen der Methoden).Sie können ein anderes Objekt erstellen, das Aufrufe von magischen Methoden an die zugrunde liegenden Objekte sendet. Hier ist, wie Sie damit umgehen würden
__get
, aber um es vollständig zum Laufen zu bringen, müssten Sie alle relevanten magischen Methoden überschreiben. Sie werden wahrscheinlich Syntaxfehler finden, da ich sie gerade über den Kopf eingegeben habe.Viel Glück.
quelle
quelle
$objectB
enthält die zusammengeführten Daten.Ich verstehe, dass die Verwendung der generischen Objekte [stdClass ()] und deren Umwandlung als Arrays die Frage beantwortet, aber ich fand, dass der Compositor eine großartige Antwort war. Ich hatte jedoch das Gefühl, dass es einige Funktionsverbesserungen gebrauchen und für andere nützlich sein könnte.
Eigenschaften:
Code:
Verwendung:
Beispiel:
quelle
foreach($objects as &$object) $this->with(&$object);
durch wirdforeach($objects as &$object) $this->with($object);
das Problem behoben. Quelle: [ php.net/manual/en/language.references.pass.php]if($this->first_precedence) array_push($this->composite, &$object); else array_unshift($this->composite, &$object);
sollte durchif($this->first_precedence) array_push($this->composite, $object); else array_unshift($this->composite, $object);
Eine sehr einfache Lösung, wenn Sie Objekt A und B haben:
Das ist alles. Sie haben jetzt objA mit allen Werten von objB.
quelle
Die
\ArrayObject
Klasse hat die Möglichkeit, das aktuelle Array auszutauschen , um die ursprüngliche Referenz zu trennen . Dazu gibt es zwei praktische Methoden:exchangeArray()
undgetArrayCopy()
. Der Rest ist ganz einfacharray_merge()
für das bereitgestellte Objekt mit denArrayObject
öffentlichen Eigenschaften:Die Bedienung ist so einfach:
quelle
merge($array)
man tatsächlich auch eine anfordern würde\ArrayObject
.Eine Lösung Um sowohl Methoden als auch Eigenschaften von zusammengeführten Objekten zu erhalten, müssen Sie eine Kombinatorklasse erstellen, die dies kann
einfache Verwendung
quelle
Ich würde das zweite Objekt mit einer Eigenschaft des ersten Objekts verknüpfen. Wenn das zweite Objekt das Ergebnis einer Funktion oder Methode ist, verwenden Sie Referenzen. Ex:
quelle
Zum Zusammenführen einer beliebigen Anzahl von Rohobjekten
quelle
Hier ist eine Funktion, die ein Objekt oder Array reduziert. Verwenden Sie diese Option nur, wenn Sie sicher sind, dass Ihre Schlüssel eindeutig sind. Wenn Sie gleichnamige Schlüssel haben, werden diese überschrieben. Sie müssen dies in eine Klasse einfügen und "Funktionen" durch den Namen Ihrer Klasse ersetzen. Genießen...
quelle
Lass es uns einfach halten!
Wenn das Ihre Frage nicht beantwortet, hilft es sicherlich bei der Beantwortung. Gutschrift für den obigen Code geht an mich :)
quelle
Dieser Codeausschnitt konvertiert diese Daten rekursiv in einen einzelnen Typ (Array oder Objekt) ohne die verschachtelten foreach-Schleifen. Hoffe es hilft jemandem!
Sobald ein Objekt im Array-Format vorliegt, können Sie array_merge verwenden und bei Bedarf wieder in Object konvertieren.
Verfahrensweise
Alle Kredite gehen an: Jason Oakley
quelle