php stdClass ke array

195

Saya punya masalah untuk mengubah objek stdClass ke array. Saya telah mencoba dengan cara ini:

return (array) $booking;

atau

return (array) json_decode($booking,true);

atau

return (array) json_decode($booking);

Array sebelum para pemain penuh dengan satu record, setelah saya coba cast itu kosong. Bagaimana cara mencetak / mengubahnya tanpa menghapus barisnya?

array sebelum dilemparkan:

array(1) {   [0]=>   object(stdClass)#23 (36) {     ["id"]=>     string(1) "2"     ["name"]=>     string(0) ""     ["code"]=>     string(5) "56/13"   } } 

setelah pemain kosong NULL jika saya mencoba membuat var_dump($booking);

Saya juga sudah mencoba fungsi ini tetapi selalu kosong:

public function objectToArray($d) {
        if (is_object($d)) {
            // Gets the properties of the given object
            // with get_object_vars function
            $d = get_object_vars($d);
        }

        if (is_array($d)) {
            /*
            * Return array converted to object
            * Using __FUNCTION__ (Magic constant)
            * for recursive call
            */
            return array_map(__FUNCTION__, $d);
        }
        else {
            // Return array
            return $d;
        }
    }
Alessandro Minoccheri
sumber
php.net/var_dump ... php.net/var_export - sebelumnya return. Dan berlarijson_decode array tampaknya sangat menyedihkan bagi saya, mungkin duduk terlalu lama di depan komputer dan sekarang saatnya untuk istirahat?
hakre
Hanya untuk memperjelas: var_dump($booking);keluaranNULL ?
hakre
setelah dicoba ya, dan jika saya mencoba mencetak ini: $ booking [0] ['id'] kembalikan saya yang tidak ada
Alessandro Minoccheri
Anda mungkin tertarik untuk membaca: Bagaimana cara mendapatkan pesan kesalahan yang berguna dalam PHP? - Ngomong-ngomong, aku bertanya var_dump() sebelum casting. Jangan gunakan kembali nama variabel yang sama btw. jika $bookingada sesuatu sebelum casting, itu pasti sesuatu sebelum casting dan bukan sesuatu yang berbeda setelahnya. Perbedaan antara input dan pemrosesan variabel jika tidak Anda mengalami masalah yang Anda tidak mengerti lagi apa yang Anda lakukan di sana.
hakre
Mempersingkat pertanyaan (seperti menghapus kode fungsi khusus) dapat berguna untuk melihat jawaban yang diterima tanpa harus menggulir ke bawah
cnlevy

Jawaban:

432

The malas satu lapis

Anda dapat melakukan ini dalam satu liner menggunakan metode JSON jika Anda bersedia kehilangan sedikit kinerja (meskipun beberapa telah melaporkan itu lebih cepat daripada iterasi melalui objek secara rekursif - kemungkinan besar karena PHP lambat dalam memanggil fungsi ). " Tapi aku sudah melakukan ini, " katamu. Tidak persis - Anda digunakan json_decodepada array, tetapi Anda harus menyandikannya denganjson_encode terlebih dahulu.

Persyaratan

The json_encodedan json_decodemetode. Ini secara otomatis dibundel dalam PHP 5.2.0 dan lebih tinggi. Jika Anda menggunakan versi yang lebih lama ada juga perpustakaan PECL (yang mengatakan, dalam hal ini Anda harus benar - benar memperbarui instalasi PHP Anda. Dukungan untuk 5.1 berhenti pada 2006.)


Mengkonversi array/ stdClass->stdClass

$stdClass = json_decode(json_encode($booking));

Mengkonversi array/ stdClass->array

Manual menentukan argumen kedua json_decodesebagai:

assoc
When TRUE, objek yang dikembalikan akan dikonversi menjadi array asosiatif.

Karenanya baris berikut akan mengubah seluruh objek Anda menjadi sebuah array:

$array = json_decode(json_encode($booking), true);
h2ooooooo
sumber
1
Jika (array) $booking;dalam var_dumpadalah NULL(seperti yang ditulis oleh OP), coba tebak kode ini akan kembali?
hakre
@ Habre Sepertinya tidak NULLsetelah casting sebagai array. Saya pikir OP berarti NULLsetelah menggunakan json_decode($array)yang masuk akal per manual . NULL dikembalikan jika json tidak dapat diterjemahkan
h2ooooooo
4
@AlessandroMinoccheri Alasan itu tidak bekerja sebelumnya adalah sebelum Anda menggunakan json_decode()pada array. json_decodeharus digunakan pada string JSON. Oleh karena itu, jika kita menyandikannya sebagai string JSON terlebih dahulu ( json_encode) dan kemudian mendekodekannya (menggunakan string JSON kami), maka itu berfungsi dengan baik.
h2ooooooo
3
Apakah semua orang lupa bahwa Anda akan kehilangan tipe Anda yang tidak ditentukan dalam spesifikasi JSON (tanggal misalnya)? Anda harus memiliki reviver jika Anda menggunakan pendekatan ini. Ini hanya baik jika Anda memiliki tipe dasar seperti angka, string, dan boolean.
Denis Pshenov
1
Jawaban yang bagus, saya baru saja menggunakan json_decode ($ stdClass, true);)
didando8a
68

gunakan fungsi ini untuk mendapatkan kembali array standar dari tipe yang Anda cari ...

return get_object_vars($booking);
robzero
sumber
19
Ini bukan rekursif
gawpertron
17

Karena array sebelum Anda melemparkannya, casting itu tidak masuk akal.

Anda mungkin ingin pemain rekursif, yang akan terlihat seperti ini:

function arrayCastRecursive($array)
{
    if (is_array($array)) {
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                $array[$key] = arrayCastRecursive($value);
            }
            if ($value instanceof stdClass) {
                $array[$key] = arrayCastRecursive((array)$value);
            }
        }
    }
    if ($array instanceof stdClass) {
        return arrayCastRecursive((array)$array);
    }
    return $array;
}

Pemakaian:

$obj = new stdClass;
$obj->aaa = 'asdf';
$obj->bbb = 'adsf43';
$arr = array('asdf', array($obj, 3));

var_dump($arr);
$arr = arrayCastRecursive($arr);
var_dump($arr);

Hasil sebelum:

array
    0 => string 'asdf' (length = 4)
  1 => 
    array
        0 =>
        object(stdClass)[1]
          public 'aaa' => string 'asdf' (length = 4)
          public 'bbb' => string 'adsf43' (length = 6)
      1 => int 3

Hasil setelah:

array
    0 => string 'asdf' (length = 4)
  1 => 
    array
        0 =>
        array
          'aaa' => string 'asdf' (length = 4)
          'bbb' => string 'adsf43' (length = 6)
      1 => int 3

catatan:

Diuji dan bekerja dengan array kompleks di mana objek stdClass dapat berisi objek stdClass lainnya.

Vlad Preda
sumber
Bagus. Sekarang berfungsi untuk objek stdClass yang berisi objek stdClass :)
Vlad Preda
14

Silakan gunakan fungsi php berikut untuk mengubah stdClass php ke array

get_object_vars($data)
Nalantha
sumber
2
Perhatikan bahwa fungsi ini tidak rekursif. Lihat jawaban oleh Carlo Fontanos untuk solusi rekursif.
Courtney Miles
12

Gunakan fungsionalitas tipe cor bawaan, cukup ketik

$realArray = (array)$stdClass;
David Clews
sumber
1
Saya lebih suka ini daripada json_decode / encode, jauh lebih bersih +1
Logan
2
Metode ini lebih bersih, namun juga tidak rekursif, dan berfungsi sama dengan get_object_vars (). Walaupun metode json_decode / encode memiliki nuansa hack, ia bekerja secara rekursif.
Debbie V
3

Googled saja, dan temukan di sini fungsi praktis yang berguna untuk mengubah objek stdClass ke array secara rekursif.

<?php
function object_to_array($object) {
 if (is_object($object)) {
  return array_map(__FUNCTION__, get_object_vars($object));
 } else if (is_array($object)) {
  return array_map(__FUNCTION__, $object);
 } else {
  return $object;
 }
}
?>

EDIT : Saya memperbarui jawaban ini dengan konten dari sumber tertaut (yang juga berubah sekarang), terima kasih kepada mason81 karena telah menyarankan saya.

shasi kanth
sumber
1
Lain kali harap sertakan konten yang relevan dari sumber tertaut. Tautan yang Anda berikan telah berubah dan sekarang tidak relevan dan tidak berguna.
mason81
Ini yang saya cari, terima kasih banyak.
0

Ini adalah versi jawaban Carlo yang dapat digunakan di kelas:

class Formatter
{
    public function objectToArray($data)
    {
        if (is_object($data)) {
            $data = get_object_vars($data);
        }

        if (is_array($data)) {
            return array_map(array($this, 'objectToArray'), $data);
        }

        return $data;
    }
}
Loren
sumber
0

Kode berikut akan membaca semua email & mencetak Subjek, Badan & Tanggal.

<?php
  $imap=imap_open("Mailbox","Email Address","Password");
  if($imap){$fixMessages=1+imap_num_msg($imap);  //Check no.of.msgs
/*
By adding 1 to "imap_num_msg($imap)" & starting at $count=1
   the "Start" & "End" non-messages are ignored
*/
    for ($count=1; $count<$fixMessages; $count++){
      $objectOverview=imap_fetch_overview($imap,$count,0);
print '<br>$objectOverview: '; print_r($objectOverview);
print '<br>objectSubject ='.($objectOverview[0]->subject));
print '<br>objectDate ='.($objectOverview[0]->date);
      $bodyMessage=imap_fetchbody($imap,$count,1);
print '<br>bodyMessage ='.$bodyMessage.'<br><br>';
    }  //for ($count=1; $count<$fixMessages; $count++)
  }  //if($imap)
  imap_close($imap);
?>

Ini menghasilkan yang berikut:

$objectOverview: Array ( [0] => stdClass Object ( [subject] => Hello
[from] => Email Address [to] => Email Address [date] => Sun, 16 Jul 2017 20:23:18 +0100
[message_id] =>  [size] => 741 [uid] => 2 [msgno] => 2 [recent] => 0 [flagged] => 0 
[answered] => 0 [deleted] => 0 [seen] => 1 [draft] => 0 [udate] => 1500232998 ) )
objectSubject =Hello
objectDate =Sun, 16 Jul 2017 20:23:18 +0100
bodyMessage =Test 

Setelah bergumul dengan berbagai saran, saya menggunakan trial & error untuk menghasilkan solusi ini. Semoga ini bisa membantu.

walter1957
sumber
0

Berikut adalah fungsi Object to Array terbaik yang saya miliki - bekerja secara rekursif:

function object_to_array($obj, &$arr){

    if(!is_object($obj) && !is_array($obj)){
        $arr = $obj;
        return $arr;
    }

    foreach ($obj as $key => $value)
    {
        if (!empty($value))
        {
            $arr[$key] = array();
            object_to_array_v2($value, $arr[$key]);
        }
        else
        {
            $arr[$key] = $value;
        }
    }
    return $arr;
}

$ clean_array = object_to_array ($ object_data_here);

nsdb
sumber