Kami memiliki dua objek PHP5 dan ingin menggabungkan konten satu menjadi yang kedua. Tidak ada konsep subclass di antara mereka sehingga solusi yang dijelaskan dalam topik berikut ini tidak dapat diterapkan.
Bagaimana Anda menyalin objek PHP ke jenis objek yang berbeda
//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;
Catatan:
- Ini adalah objek, bukan kelas.
- Benda-benda itu berisi cukup banyak bidang sehingga pendahuluan akan cukup lambat.
- Sejauh ini kami mempertimbangkan untuk mengubah objek A dan B menjadi array kemudian menggabungkannya menggunakan array_merge () sebelum mentransformasikannya menjadi objek tetapi kami tidak dapat mengatakan kami bangga jika ini.
Jawaban:
Ini sebenarnya juga berfungsi ketika benda memiliki metode. (diuji dengan PHP 5.3 dan 5.6)
sumber
stdclass
. Sementara itu "bekerja" dalam arti pada objek dengan metode, itu secara efektif merusak objek dalam kasus itu (dengan menghapus metode).Anda bisa membuat objek lain yang mengirimkan panggilan ke metode ajaib ke objek yang mendasarinya. Begini cara Anda menangani
__get
, tetapi untuk membuatnya bekerja sepenuhnya Anda harus mengganti semua metode sihir yang relevan. Anda mungkin akan menemukan kesalahan sintaksis karena saya baru saja memasukkannya dari atas kepala saya.Semoga berhasil.
sumber
sumber
$objectB
menampung data yang digabungkan.Saya mengerti bahwa menggunakan objek generik [stdClass ()] dan menuangnya sebagai array menjawab pertanyaan, tetapi saya pikir Compositor adalah jawaban yang bagus. Namun saya merasa itu bisa menggunakan beberapa peningkatan fitur dan mungkin berguna untuk orang lain.
Fitur:
Kode:
Pemakaian:
Contoh:
sumber
foreach($objects as &$object) $this->with(&$object);
denganforeach($objects as &$object) $this->with($object);
memperbaiki masalah. Sumber: [ php.net/manual/en/language.references.pass.php]if($this->first_precedence) array_push($this->composite, &$object); else array_unshift($this->composite, &$object);
harus diganti denganif($this->first_precedence) array_push($this->composite, $object); else array_unshift($this->composite, $object);
Solusi yang sangat sederhana mengingat Anda memiliki objek A dan B:
Itu saja. Anda sekarang memiliki objA dengan semua nilai dari objB.
sumber
The
\ArrayObject
kelas memiliki kemungkinan untuk bertukar array saat ini untuk memutuskan asli referensi . Untuk melakukannya, ia datang dengan dua metode praktis:exchangeArray()
dangetArrayCopy()
. Sisanya sederhanaarray_merge()
dari objek yang disediakan denganArrayObject
properti publik:Penggunaannya semudah ini:
sumber
merge($array)
benar-benar meminta\ArrayObject
juga.solusi Untuk mempertahankan, baik metode dan properti dari onjects yang digabung adalah membuat kelas kombinator yang bisa
penggunaan sederhana
sumber
Saya akan pergi dengan menghubungkan objek kedua ke properti dari objek pertama. Jika objek kedua adalah hasil dari fungsi atau metode, gunakan referensi. Ex:
sumber
Untuk menggabungkan sejumlah objek mentah
sumber
Berikut adalah fungsi yang akan meratakan objek atau array. Gunakan ini hanya jika Anda yakin kunci Anda unik. Jika Anda memiliki kunci dengan nama yang sama mereka akan ditimpa. Anda harus menempatkan ini di kelas dan mengganti "Fungsi" dengan nama kelas Anda. Nikmati...
sumber
Mari kita tetap sederhana!
Jika itu tidak menjawab pertanyaan Anda, pasti akan membantu menuju jawabannya. Kredit untuk kode di atas berlaku untuk saya sendiri :)
sumber
Potongan kode ini akan secara rekursif mengkonversi data itu menjadi satu jenis (array atau objek) tanpa loop foreach bersarang. Semoga ini bisa membantu seseorang!
Setelah Object dalam format array, Anda dapat menggunakan array_merge dan mengkonversi kembali ke Obyek jika perlu.
Cara prosedural
Semua kredit diberikan kepada: Jason Oakley
sumber