Bagaimana cara mengonversi objek ke array?

204
<?php
   print_r($response->response->docs);
?>

Output sebagai berikut:

    Array 
(
    [0] => Object 
            (
                [_fields:private] => Array 
                                    (
                                        [id]=>9093 
                                        [name]=>zahir
                                    ) 
            Object 
            ( 
                [_fields:private] => Array 
                                    (
                                        [id]=>9094 
                                        [name]=>hussain
                                    )..
            )
)

Bagaimana saya bisa mengonversi objek ini ke array? Saya ingin menampilkan yang berikut:

Array
(
    [0]=>
    (
        [id]=>9093 
        [name]=>zahir
    ) 
    [1]=>
    (
        [id]=>9094 
        [name]=>hussain
    )...
)

Apakah ini mungkin?

zahir hussain
sumber

Jawaban:

133

Anda harus melihat get_object_vars , karena properti Anda dinyatakan pribadi Anda harus memanggil ini di dalam kelas dan mengembalikan hasilnya.

Hati-hati, untuk tipe data primitif seperti string, ini akan bekerja dengan baik, tapi saya tidak tahu bagaimana perilakunya dengan objek bersarang.

dalam kasus Anda, Anda harus melakukan sesuatu seperti;

<?php
   print_r(get_object_vars($response->response->docs));
?>
Benoit
sumber
385

Array satu dimensi

Untuk mengonversi array satu dimensi, Anda dapat menggunakan (array)atau ada get_object_vars, yang disebutkan Benoit dalam jawabannya .

// Cast to an array
$array = (array) $object;
// get_object_vars
$array = get_object_vars($object);

Mereka bekerja sedikit berbeda satu sama lain. Sebagai contoh, get_object_varsakan mengembalikan array dengan hanya properti yang dapat diakses publik kecuali dipanggil dari dalam lingkup objek yang Anda lewati (yaitu dalam fungsi anggota objek). (array), di sisi lain, akan dilemparkan ke array dengan semua anggota publik, pribadi dan dilindungi utuh pada array, meskipun semua publik sekarang, tentu saja.

Array multi dimensi

Metode yang agak kotor adalah menggunakan PHP> = 5,2 fungsi JSON asli untuk menyandikan ke JSON dan kemudian mendekode kembali ke array. Ini tidak akan mencakup anggota pribadi dan terlindungi, dan tidak cocok untuk objek yang berisi data yang tidak dapat dikodekan JSON (seperti data biner).

// The second parameter of json_decode forces parsing into an associative array
$array = json_decode(json_encode($object), true);

Atau, fungsi berikut akan mengkonversi dari objek ke array termasuk anggota pribadi dan yang dilindungi, diambil dari sini dan dimodifikasi untuk menggunakan casting:

function objectToArray ($object) {
    if(!is_object($object) && !is_array($object))
        return $object;

    return array_map('objectToArray', (array) $object);
}
Andy E
sumber
5
Solusi pertama tidak menangani mutlidimensi, tetapi solusi kedua bekerja sangat baik.
sbuck
1
Solusi 2 mengingatkan saya ada parameter 2 untuk json_decode () yang saya lupa .. terima kasih.
Tyler
1
Saya heran mengapa jawaban ini mendapatkan begitu banyak suara. Kedua solusi kurang jelas dan cantik daripada get_object_vars
RJD22
3
@ RJD22: Saya telah memperbarui jawaban saya untuk menjadikannya lebih sebagai sumber daya 'de facto', mudah-mudahan Anda menganggapnya layak untuk dipilih sekarang. ;-) Catatan untuk semua orang bahwa "solusi ke-2" yang disebutkan di sini adalah solusi JSON, yang merupakan solusi ke-2 dalam jawaban pertama saya.
Andy E
LUAR BIASA! Saya kagum dengan solusi dan gulir ke bawah untuk menemukan ini!
eozzy
44

Anda dapat dengan cepat mengonversi objek yang sangat bersarang ke array asosiatif dengan mengandalkan perilaku fungsi penyandian / dekode JSON:

$array = json_decode(json_encode($response->response->docs), true);
Mufaddal
sumber
2
Ini adalah jawaban paling sederhana untuk masalah ini. Digunakan dan itu bekerja dengan luar biasa. Terima kasih
Dustin Fraker
7
Hanya sebuah catatan - ini akan berfungsi jika array Anda berisi data valid UTF8. Jika array Anda mengandung beberapa penyandian lain, katakanlah Win1250, itu akan gagal, karena json_encode akan gagal (php 5.3)
Radek
Bagaimana cara mengubahnya kembali ke suatu objek?
Pmpr
@Trix gunakan json lagi json_decode (json_encode ($ array), FALSE); Ini juga (secara rekursif) mengubah semua sub array Anda menjadi objek,
Mufaddal
Saya berharap bisa melakukan uptick lebih dari satu kali.
JohnFF
34

Cermat:

$array = (array) $object;

apakah konversi dangkal ($ object-> innerObject = new stdClass () tetap menjadi objek) dan mengkonversi bolak-balik menggunakan json works tetapi itu bukan ide yang baik jika kinerja merupakan masalah.

Jika Anda membutuhkan semua objek untuk dikonversi ke array asosiatif di sini adalah cara yang lebih baik untuk melakukan itu (kode robek dari saya tidak ingat di mana):

function toArray($obj)
{
    if (is_object($obj)) $obj = (array)$obj;
    if (is_array($obj)) {
        $new = array();
        foreach ($obj as $key => $val) {
            $new[$key] = toArray($val);
        }
    } else {
        $new = $obj;
    }

    return $new;
}
Sergio
sumber
Saya tidak bisa membaca array yang dihasilkan dari pengecoran objek: codepad.viper-7.com/AkX5pq Apakah Anda punya penjelasan tentang itu?
Damien
1
Saya suka jawaban ini. Fungsi rekursif Andy E pada dasarnya melakukan hal yang sama, tetapi saya menemukan ini lebih mudah dimengerti.
HartleySan
20
$array = json_decode(json_encode($object), true);

Saya mencoba beberapa cara untuk melakukan foreachdengan objek dan ini benar-benar solusi yang paling mudah dan keren yang pernah saya lihat. Hanya satu baris :)

m3nda
sumber
Ini berfungsi sempurna hanya dengan atribut objek publik. Tidak menganggap yang pribadi.
Limon
Berikut adalah beberapa penjelasan tentang penggunaan fungsi JsonSerialize, tetapi bukan solusi satu baris dan saya baca tentang ini bukan praktik yang baik :( stackoverflow.com/questions/7005860/… . Terima kasih atas sarannya.
m3nda
Bagaimana cara mengubahnya kembali ke suatu objek?
Pmpr
18

Versi sederhana:

$arrayObject = new ArrayObject($object);
$array = $arrayObject->getArrayCopy();

Versi rekursif yang diperbarui:

class RecursiveArrayObject extends ArrayObject
{
    function getArrayCopy()
    {
        $resultArray = parent::getArrayCopy();
        foreach($resultArray as $key => $val) {
            if (!is_object($val)) {
                continue;
            }
            $o = new RecursiveArrayObject($val);
            $resultArray[$key] = $o->getArrayCopy();
        }
        return $resultArray;
    }
}

$arrayObject = new RecursiveArrayObject($object);
$array = $arrayObject->getArrayCopy();
Styx
sumber
2

Coba ini:-

 <?php
  print_r(json_decode(json_encode($response->response->docs),true));
 ?>
kunal
sumber
2

Saya memiliki masalah yang sama dan saya menyelesaikannya dengan get_object_vars yang disebutkan di atas.

Selain itu, saya harus mengkonversi objek saya dengan json_decode dan saya harus mengulangi array dengan loop oldschool "for" (daripada masing-masing).

Lucas Bacciotti
sumber
0

Anda juga dapat menggunakan metode array_values ​​() dari php

Rikin Adhyapak
sumber
2
Kamu tidak bisa "Array_values ​​() mengharapkan parameter 1 menjadi array, objek yang diberikan".
manatwork
0

Saya mengalami masalah dengan jawaban Andy Earnshaw karena saya telah memfaktorkan fungsi ini ke kelas terpisah dalam aplikasi saya, "HelperFunctions", yang berarti panggilan rekursif ke objectToArray () gagal.

Saya mengatasinya dengan menentukan nama kelas dalam panggilan array_map seperti:

public function objectToArray($object) {
    if (!is_object($object) && !is_array($object))
        return $object;
    return array_map(array("HelperFunctions", "objectToArray"), (array) $object);
}

Saya akan menulis ini di komentar tetapi saya belum memiliki reputasi yang cukup.

leon.clements
sumber
-2
//My Function is worked. Hope help full for you :)
      $input = [
            '1' => (object) [1,2,3],
            '2' => (object) [4,5,6,
                (object) [6,7,8,
                [9, 10, 11,
                    (object) [12, 13, 14]]]
            ],
            '3' =>[15, 16, (object)[17, 18]]
        ];

        echo "<pre>";
        var_dump($input);
        var_dump(toAnArray($input));

      public function toAnArray(&$input) {

        if (is_object($input)) {
            $input = get_object_vars($input);
        }
        foreach ($input as &$item) {
            if (is_object($item) || is_array($item)) {
                if (is_object($item)) {
                    $item = get_object_vars($item);
                }
                self::toAnArray($item);
            }
        }
    }
nguyentrung206
sumber
fungsi Anda tidak mengembalikan apa pun. tidak ada cara kerjanya!
Rotimi