2つのPHPオブジェクトをマージする最良の方法は?
PHP5のオブジェクトが2つあり、片方の内容をもう片方にマージしたいと考えています。それらの間にはサブクラスの概念がないので、以下のトピックで説明されている解決策は適用できません。
PHP オブジェクトを別のオブジェクト型にコピーする方法 を参照ください。
//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;
**備考
- これらはクラスではなくオブジェクトです。
- オブジェクトは非常に多くのフィールドを含むので、foreach は非常に時間がかかります。
- 今のところ、オブジェクトAとBを配列に変換し、オブジェクトに再変換する前に、 array_merge()を使ってそれらをマージすることを考えていますが、これを誇りに思うことはできません。
214
13
これは、オブジェクトにメソッドがある場合にも機能します。 (PHP 5.3および5.6でテスト済み)。
オブジェクトがフィールドだけを含む(メソッドを含まない)場合、これは機能する:
マジックメソッドへの呼び出しを基礎となるオブジェクトにディスパッチする別のオブジェクトを作ることもできる。 以下は
__get
の処理方法ですが、これを完全に動作させるには、関連するすべてのマジックメソッドをオーバーライドする必要があります。 しかし、完全に動作させるには、関連するすべてのマジックメソッドをオーバーライドする必要があります。幸運を祈ります。
ジェネリックオブジェクト[stdClass()]を使用して配列としてキャストすると問題が発生することは理解していますが、Compositorは素晴らしい答えだと思いました。 それでも、いくつかの機能強化を使用でき、他の誰かに役立つかもしれないと感じました。
特徴:
-参照またはクローンを指定します。 -優先する最初または最後のエントリを指定します。 -alray_mergeと構文の類似性を持つ複数の(2つ以上の)オブジェクト。 -メソッドリンク:$ obj-> f1()-> f2()-> f3()。.. -ダイナミックコンポジット:$ obj-> merge(。..)/ ここで作業 / $ obj-> merge(。..)。
コード:
使用法:
例:
オブジェクトAとBがあることを考慮した非常に単純なソリューション:
それで全部です。 これでobjBのすべての値を持つobjAができました。
ソリューションマージされたオンジェクトからメソッドとプロパティの両方を保持するには、可能なコンビネータクラスを作成します。
-constructで任意の数のオブジェクトを取ります。 -callを使用して任意のメソッドにアクセスします。 -__getを使用して任意のプロパティをaccsessします。
----------。
----------。
簡単な使用。
任意の数の生のオブジェクトをマージします。
\ ArrayObject
クラスは、現在の配列を_exchange_して元の_reference_を切断する可能性があります。 これを行うには、2つの便利な方法(exchangeArray()
とgetArrayCopy()
)が付属しています。 残りは、提供されたオブジェクトの単純なarray_merge()
で、ArrayObject
sのパブリックプロパティがあります。使用法はこれと同じくらい簡単です:
2番目のオブジェクトを1番目のオブジェクトのプロパティにリンクします。 2番目のオブジェクトが関数またはメソッドの結果である場合は、参照を使用します。 例:
簡単にしましょう。!
それがあなたの質問に答えなければ、それは確かに答えに向かって助けになるでしょう。 上記のコードのクレジットは私に行きます:)。
これは、オブジェクトまたは配列をフラット化する関数です。 キーが一意であることを確認した場合にのみ、これを使用してください。 同じ名前のキーがある場合、それらは上書きされます。 これをクラスに配置し、「関数」をクラスの名前に置き換える必要があります。 楽しい。..
このコードのスニペットは、ネストされたフォーラムループなしで、そのデータを単一のタイプ(配列またはオブジェクト)に再帰的に変換します。 それが誰かを助けることを願っています。!
オブジェクトが配列形式になったら、array_mergeを使用して、必要に応じてオブジェクトに戻すことができます。
手続き方法。
すべてのクレジットは次のとおりです:ジェイソンオークリー。