Saya mengintegrasikan API ke situs web saya yang berfungsi dengan data yang disimpan dalam objek saat kode saya ditulis menggunakan array.
Saya ingin fungsi cepat dan kotor untuk mengonversi objek ke array.
Cukup ketik saja
$array = (array) $yourObject;
Dari Array :
Jika suatu objek dikonversi ke array, hasilnya adalah array yang elemen-elemennya adalah properti objek. Kunci adalah nama variabel anggota, dengan beberapa pengecualian: properti integer tidak dapat diakses; variabel pribadi memiliki nama kelas yang diawali dengan nama variabel; variabel yang dilindungi memiliki '*' yang diawali dengan nama variabel. Nilai-nilai yang diawali ini memiliki byte nol di kedua sisi.
Contoh: Objek Sederhana
$object = new StdClass;
$object->foo = 1;
$object->bar = 2;
var_dump( (array) $object );
Keluaran:
array(2) {
'foo' => int(1)
'bar' => int(2)
}
Contoh: Objek Kompleks
class Foo
{
private $foo;
protected $bar;
public $baz;
public function __construct()
{
$this->foo = 1;
$this->bar = 2;
$this->baz = new StdClass;
}
}
var_dump( (array) new Foo );
Output (dengan diedit untuk kejelasan):
array(3) {
'\0Foo\0foo' => int(1)
'\0*\0bar' => int(2)
'baz' => class stdClass#2 (0) {}
}
Output dengan var_export
bukannya var_dump
:
array (
'' . "\0" . 'Foo' . "\0" . 'foo' => 1,
'' . "\0" . '*' . "\0" . 'bar' => 2,
'baz' =>
stdClass::__set_state(array(
)),
)
Mengetikkan dengan cara ini tidak akan melakukan pengecoran yang dalam dari objek grafik dan Anda perlu menerapkan byte nol (seperti yang dijelaskan dalam kutipan manual) untuk mengakses atribut non-publik. Jadi ini bekerja paling baik ketika casting objek StdClass atau objek dengan hanya properti publik Untuk cepat dan kotor (apa yang Anda minta) tidak apa-apa.
Lihat juga posting blog yang mendalam ini:
ArrayAccess
antarmuka, mungkin dalam kombinasi dengan solusi ini. php.net/manual/en/class.arrayaccess.php[1 => "one"]
menjadi["1" => "one"]
(array)
dan(object)
bekerja dengan andal dan sama di semua versi sejak PHP 4.3. Lihat 3v4l.org/X6lhm . Jika Anda mendapatkan kesalahan sintaks, Anda melakukan kesalahan.empty
. Anda tidak dapat menggunakan ekspresi denganempty
sebelum 5,5. Ini sama sekali tidak terkait dengan typecasting;)Anda dapat dengan cepat mengonversi objek yang sangat bersarang ke array asosiatif dengan mengandalkan perilaku fungsi penyandian / dekode JSON:
sumber
Dari hit Google pertama untuk " objek PHP ke array assoc " kita punya ini:
Sumbernya ada di codesnippets.joyent.com .
sumber
function objectToArray($o) { $a = array(); foreach ($o as $k => $v) $a[$k] = (is_array($v) || is_object($v)) ? objectToArray($v): $v; return $a; }
Ini hanya mengatur apa pun yang bukan objek atau array dan melanjutkan tanpa penarikan berulang-ulang ke metode kecuali diperlukan.Jika properti objek Anda bersifat publik, Anda dapat melakukannya:
Jika mereka pribadi atau dilindungi, mereka akan memiliki nama kunci yang aneh pada array. Jadi, dalam hal ini Anda akan membutuhkan fungsi berikut:
sumber
Keluaran
sumber
Ini beberapa kode:
sumber
Semua jawaban lain yang diposting di sini hanya berfungsi dengan atribut publik. Berikut adalah salah satu solusi yang berfungsi dengan objek mirip JavaBeans menggunakan refleksi dan getter:
sumber
public
properti?Bagaimana dengan
get_object_vars($obj)
? Tampaknya berguna jika Anda hanya ingin mengakses properti publik dari suatu objek.Lihat get_object_vars .
sumber
Ketik melemparkan objek Anda ke array.
Itu akan menyelesaikan masalah Anda.
sumber
Pertama-tama, jika Anda membutuhkan array dari suatu objek, Anda mungkin harus menyusun data sebagai array terlebih dahulu. Pikirkan tentang itu.
Jangan gunakan a
foreach
pernyataan atau transformasi JSON. Jika Anda merencanakan ini, sekali lagi Anda bekerja dengan struktur data, bukan dengan objek.Jika Anda benar-benar membutuhkannya gunakan pendekatan berorientasi objek untuk memiliki kode yang bersih dan dapat dipelihara. Sebagai contoh:
Objek sebagai array
Jika Anda membutuhkan semua properti, gunakan objek transfer:
sumber
Anda dapat dengan mudah menggunakan fungsi ini untuk mendapatkan hasilnya:
Gunakan PHP 5 atau lebih baru.
sumber
Inilah fungsi PHP rekursif saya untuk mengonversi objek PHP ke array asosiatif:
Contoh penggunaan:
sumber
$new_arr1 = (array) $my_object;
Untuk mengonversi objek menjadi array, cukup masukkan secara eksplisit:
sumber
Anda juga dapat membuat fungsi dalam PHP untuk mengonversi objek array:
sumber
Anda mungkin ingin melakukan ini ketika Anda memperoleh data sebagai objek dari database:
sumber
Fungsi kustom untuk mengonversi stdClass ke array:
Fungsi kustom lain untuk mengonversi Array ke stdClass:
Contoh Penggunaan:
sumber
Menggunakan:
Ini mengembalikan array tanpa karakter khusus dan nama kelas.
sumber
Jawaban ini hanya penyatuan jawaban yang berbeda dari posting ini, tapi itu solusi untuk mengubah objek PHP dengan properti publik atau pribadi dengan nilai sederhana atau array ke array asosiatif ...
sumber
Beberapa perbaikan pada kode "well-knwon"
Perhatikan bahwa jika fungsinya anggota kelas (seperti di atas) Anda harus berubah
__FUNCTION__
menjadi__METHOD__
sumber
Anda juga dapat menggunakan Komponen Symfony Serializer
sumber
Untuk kasus Anda itu benar / indah jika Anda akan menggunakan pola "dekorator" atau "transformasi model tanggal". Sebagai contoh:
Model Anda
Penghias
Pemakaian
Jadi itu akan menjadi kode yang lebih indah dan lebih benar.
sumber
Mengonversi dan menghapus bintang yang mengganggu:
Mungkin, ini akan lebih murah daripada menggunakan refleksi.
sumber
Solusi singkat dari @ SpYk3HH
sumber
Karena banyak orang menemukan pertanyaan ini karena mengalami masalah dengan atribut akses secara dinamis dari suatu objek, saya hanya akan menunjukkan bahwa Anda dapat melakukan ini dalam PHP:
$valueRow->{"valueName"}
Dalam konteks (keluaran HTML dihapus untuk dibaca):
sumber
Dengan menggunakan typecasting Anda dapat menyelesaikan masalah Anda. Cukup tambahkan baris berikut ke objek kembali Anda:
Anda juga dapat menambahkan pasangan kunci dan nilai baru dengan menggunakan:
sumber
Saya pikir itu ide yang bagus untuk menggunakan ciri-ciri untuk menyimpan logika konversi objek-ke-array. Contoh sederhana:
sumber
sumber
Di sini saya telah membuat metode objectToArray () , yang juga berfungsi dengan objek rekursif, seperti ketika
$objectA
berisi$objectB
yang menunjuk ke$objectA
.Selain itu, saya membatasi output untuk properti publik menggunakan ReflectionClass. Singkirkan itu, jika Anda tidak membutuhkannya.
Untuk mengidentifikasi objek yang sudah digunakan, saya menggunakan properti yang dilindungi di kelas (abstrak) ini, bernama
$this->usedObjects
. Jika objek bersarang rekursif ditemukan, itu akan digantikan oleh string**recursive**
. Kalau tidak, ia akan gagal karena infinite loop.sumber
$usedObjects
tidak diinisialisasi di awal, sehingga panggilan ini beberapa kali akan memberikan hasil yang salah pada panggilan selanjutnya. Selain itu, Anda tidak membebaskannya pada akhirnya, sehingga objek Anda tidak akan pernah dihapus dari memori.Ada proposal saya, jika Anda memiliki objek di objek bahkan dengan anggota pribadi:
sumber
Saya menggunakan ini (diperlukan solusi rekursif dengan kunci yang tepat):
Contoh penggunaan, kode berikut:
Akan mencetak ini:
sumber