Bagaimana saya bisa mengubah array seperti ini ke objek?
[128] => Array
(
[status] => Figure A.
Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution.
)
[129] => Array
(
[status] => The other day at work, I had some spare time
)
$a = (object)['hello' => 'world'];
Jawaban:
Dalam kasus paling sederhana, itu mungkin cukup untuk "melemparkan" array sebagai objek:
Opsi lain adalah dengan instantiate kelas standar sebagai variabel, dan loop melalui array Anda saat menetapkan ulang nilai-nilai:
Seperti yang ditunjukkan Edson Medina , solusi yang sangat bersih adalah dengan menggunakan
json_
fungsi bawaan:Ini juga (secara rekursif) mengubah semua sub array Anda menjadi objek, yang mungkin atau mungkin tidak Anda inginkan. Sayangnya itu memiliki kinerja 2-3x hit atas pendekatan perulangan.
Peringatan! (terima kasih kepada Ultra untuk komentarnya):
sumber
x
dalam array menyimpan referensi ke array lain. Kemudian$object->x
setelah eksekusi one-liner Anda akan menjadi duplikat$array['x']
, bukan lagi referensi ke array asli. Ini mungkin tidak berbahaya di beberapa aplikasi, tetapi untuk array besar itu membuang-buang memori dan mungkin mengacaukan eksekusi jika referensi sedang digunakan nanti.Anda cukup menggunakan tipe casting untuk mengubah array menjadi objek.
sumber
Cara mudahnya adalah
Tetapi bukan itu yang Anda inginkan. Jika Anda menginginkan objek, Anda ingin mencapai sesuatu, tetapi itu tidak ada dalam pertanyaan ini. Menggunakan objek hanya karena alasan menggunakan objek tidak masuk akal.
sumber
Retas cepat:
Tidak cantik, tapi berhasil.
sumber
$this
komentar yang mengikuti sebagai pengakses, ini sangat tersirat ia menginginkanstdClass
instance sebagai output dan tidak kelas yang ditentukan pengguna seperti penggunaan jawaban Anda. Saya setuju dengan keanggunan solusi ini, tetapi sayangnya itu adalah pola yang cukup umum digunakan untuk menyelesaikan masalah ini dengan array bersarang di mana casting ke objek tidak akan bekerja. Mungkin juga OP menggunakan antarmuka yang membutuhkan dan objek sebagai input dan bukan array.Berikut ini tiga cara:
Palsu objek nyata:
Konversikan array menjadi objek dengan melemparkannya ke objek:
Konversi array menjadi objek secara manual:
sumber
Caranya sederhana, Ini akan membuat objek untuk array rekursif juga:
sumber
false
kejson_decode()
akan mengembalikan array asosiatif.true
untukjson_decode
akan mengembalikan array asosiatif,false
adalah default dan akan mengembalikanStdClass
instance.Tergantung di mana Anda membutuhkannya dan bagaimana mengakses objek ada berbagai cara untuk melakukannya.
Misalnya: cukup ketik saja
Namun, yang paling kompatibel adalah menggunakan metode utilitas (belum menjadi bagian dari PHP) yang mengimplementasikan casting PHP standar berdasarkan string yang menentukan jenis (atau dengan mengabaikannya hanya de-referensi nilai):
Contoh penggunaan dalam kasus Anda ( Demo Online ):
sumber
Yang ini berhasil untuk saya
penggunaan:
pengembalian:
seperti biasa Anda dapat mengulanginya seperti:
sumber
$obj = (object) $array;
tidak berfungsi untuk array multidimensi.Tidak ada metode bawaan untuk melakukannya sejauh yang saya ketahui, tetapi semudah loop sederhana:
Anda dapat menguraikan hal itu jika Anda membutuhkannya untuk membangun objek Anda secara rekursif.
sumber
Anda dapat menggunakan fungsi (objek) untuk mengubah array Anda menjadi objek.
Hasilnya akan menjadi objek yang berisi array:
sumber
Sebenarnya jika Anda ingin menggunakan ini dengan array multi-dimensi Anda ingin menggunakan beberapa rekursi.
sumber
Saya pasti akan pergi dengan cara bersih seperti ini:
jika Anda mengirimkan:
Anda akan mendapatkan ini:
Saya menemukan ini lebih logis membandingkan jawaban di atas dari Objects harus digunakan untuk tujuan mereka telah dibuat (dikemas objek kecil yang lucu).
Juga menggunakan get_object_vars memastikan bahwa tidak ada atribut tambahan yang dibuat di Objek yang dimanipulasi (Anda tidak ingin mobil yang memiliki nama keluarga, atau orang yang berperilaku 4 roda).
sumber
Anda juga dapat menggunakan ArrayObject, misalnya:
sumber
Yang saya gunakan (ini adalah anggota kelas):
sumber
Sedikit rumit tapi mudah untuk memperpanjang teknik:
Misalkan Anda memiliki array
Misalkan Anda memiliki kelas Person yang mungkin memiliki atribut lebih atau kurang dari array ini. sebagai contoh
Jika Anda masih ingin mengubah array Anda ke objek orang. Anda dapat menggunakan Kelas ArrayIterator.
Sekarang Anda memiliki objek iterator.
Buat kelas memperluas Kelas FilterIterator; di mana Anda harus mendefinisikan metode abstrak terima. Ikuti contohnya
Impelmentasi di atas akan mengikat properti hanya jika ada di kelas.
Tambahkan satu metode lagi di kelas PersonIterator
Pastikan Anda memiliki mutator yang ditentukan di kelas Anda. Sekarang Anda siap memanggil fungsi ini di mana Anda ingin membuat objek.
sumber
rekursi adalah teman Anda:
sumber
Ini membutuhkan PHP7 karena saya memilih untuk menggunakan fungsi lambda untuk mengunci 'fungsi dalam' di dalam fungsi utama. Fungsi lambda disebut rekursif, maka kebutuhan untuk: "use (& $ innerfunc)". Anda bisa melakukannya di PHP5 tetapi tidak bisa menyembunyikan fungsi dalam.
sumber
gunakan fungsi ini yang saya buat:
Pemakaian:
sumber
satu liner
sumber
x
dalam array menyimpan referensi ke array lain. Kemudian$object->x
setelah eksekusi one-liner Anda akan menjadi duplikat$result_array['x']
, bukan array yang identik.Mudah:
Contoh:
Kemudian, yang berikut ini benar:
sumber
Anda juga bisa melakukan ini dengan menambahkan (objek) di sebelah kiri variabel untuk membuat objek baru.
http://codepad.org/9YmD1KsU
sumber
Penggunaan
json_encode
bermasalah karena cara menangani data non UTF-8. Perlu dicatat bahwajson_encode
/json_encode
metode juga meninggalkan array non-asosiatif sebagai array. Ini mungkin atau mungkin bukan yang Anda inginkan. Saya baru-baru ini dalam posisi perlu menciptakan kembali fungsionalitas dari solusi ini tetapi tanpa menggunakanjson_
fungsi. Inilah yang saya pikirkan:sumber
Metode Terbaik di DUNIA :)
jika Anda menggunakan metode yang berbeda, Anda akan memiliki masalah. Ini adalah metode terbaik. Kamu pernah melihat.
sumber
Array multidimensi menjadi suatu objek. kode ini digunakan untuk konversi metode pencarian dan penangkapan API pencarian Bing.
sumber
Anda dapat menggunakan Refleksi:
sumber
CakePHP memiliki kelas Set :: map rekursif yang pada dasarnya memetakan array ke objek. Anda mungkin perlu mengubah seperti apa rupa array agar objek terlihat seperti yang Anda inginkan.
http://api.cakephp.org/view_source/set/#line-158
Kasus terburuk, Anda mungkin bisa mendapatkan beberapa ide dari fungsi ini.
sumber
Jelas hanya ekstrapolasi jawaban beberapa orang lain, tapi inilah fungsi rekursif yang akan mengubah array dimensi mulsa menjadi objek:
Dan ingat bahwa jika array memiliki tombol angka mereka masih bisa dirujuk dalam objek yang dihasilkan dengan menggunakan
{}
(misalnya:$obj->prop->{4}->prop
)sumber
Terinspirasi oleh semua kode ini, saya mencoba membuat versi yang disempurnakan dengan dukungan untuk: nama kelas tertentu, menghindari metode konstruktor, pola 'kacang' dan mode ketat (hanya set properti yang ada):
sumber
Kode
Fungsi ini berfungsi sama dengan
json_decode(json_encode($arr), false)
.Pengujian
Tes 1: Array datar
Keluaran:
Tes 2: Array objek
Keluaran:
Tes 3: Objek
Keluaran:
sumber
saya telah melakukannya dengan cara yang cukup sederhana,
sumber