Ubah objek stdClass menjadi array dalam PHP


108

Saya mengambil post_id dari postmeta sebagai:

$post_id = $wpdb->get_results("SELECT post_id FROM $wpdb->postmeta WHERE (meta_key = 'mfn-post-link1' AND meta_value = '". $from ."')");

ketika saya mencoba print_r($post_id); saya memiliki array seperti ini:

Array
(
    [0] => stdClass Object
        (
            [post_id] => 140
        )

    [1] => stdClass Object
        (
            [post_id] => 141
        )

    [2] => stdClass Object
        (
            [post_id] => 142
        )

)

dan saya tidak tahu bagaimana cara melewatinya, dan bagaimana saya bisa mendapatkan array seperti ini

Array
(
    [0]  => 140


    [1] => 141


    [2] => 142

)

Tahu bagaimana saya bisa melakukan ini?


2
Kemungkinan duplikat php stdClass ke array
mvladk

Jawaban:


244

Cara termudah adalah dengan JSON-mengenkode objek Anda dan kemudian mendekodekannya kembali ke array:

$array = json_decode(json_encode($object), true);

Atau jika mau, Anda juga dapat melintasi objek secara manual:

foreach ($object as $value) 
    $array[] = $value->post_id;

1
Mengapa kita tidak bisa melakukannya $array = json_decode($object,true)?
akshaynagpal

3
@akshaynagpal: Ini akan menghasilkan kesalahan karena Anda akan memberikan objek ke fungsi yang mengharapkan string JSON sebagai inputnya. Dalam jawabannya, saya mengubah objek menjadi string JSON, dan kemudian memasukkannya sebagai input ke json_decode () sehingga akan mengembalikan array (parameter kedua sebagai True menunjukkan bahwa array harus dikembalikan).
Amal Murali

6
saya tahu ini sudah terlambat, tetapi mengapa Anda tidak menggunakan tipe casting ... (array) $ obj
chhameed

Saya menemukan json_decode(json_encode($object), True)kembali array yang berbeda dibandingkan dengan loop foreach. Perulangan foreach mengembalikan larik dalam format yang diminta OP.
pengguna3442612

1
@NgSekLong: Tidak juga, tidak.
Amal Murali

60

Sangat sederhana, pertama ubah objek Anda menjadi objek json, ini akan mengembalikan string objek Anda menjadi perwakilan JSON.

Ambil hasil itu dan dekode dengan parameter ekstra true, yang akan diubah menjadi array asosiatif

$array = json_decode(json_encode($oObject),true);

Masalahnya adalah dengan nilai yang tidak dapat dienkode-json atau tidak terstandarisasi, mis. tanggal.
Kangur

20

Coba ini:

$new_array = objectToArray($yourObject);

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;
    }
}

1
Fungsi sempurna untuk mengubah objek st menjadi array
Vivek

16

Anda dapat mengonversi objek std menjadi array seperti ini:

$objectToArray = (array)$object;

1
Ini bagus, tetapi hanya mengubah tingkat pertama. Jika Anda memiliki penyarangan, Anda harus melakukannya untuk semua node.
Ivan Carosati

7

Untuk array satu dimensi:

$array = (array)$class; 

Untuk array multi-dimensi:

function stdToArray($obj){
  $reaged = (array)$obj;
  foreach($reaged as $key => &$field){
    if(is_object($field))$field = stdToArray($field);
  }
  return $reaged;
}

5
Selamat datang di SO. Maukah Anda memperluas jawaban Anda sedikit untuk menjelaskan bagaimana jawaban itu menyelesaikan masalah?
gung - Kembalikan Monica

Untuk array satu dimensi: $ array = (array) $ class; Untuk larik multi-dimensi: kode dari atas
Stack Overflow

6
$wpdb->get_results("SELECT ...", ARRAY_A);

ARRAY_A adalah argumen "output_type". Ini bisa menjadi salah satu dari empat konstanta yang ditentukan sebelumnya (default ke OBJECT):

OBJECT - result will be output as a numerically indexed array of row objects.
OBJECT_K - result will be output as an associative array of row objects, using first columns values as keys (duplicates will be discarded).
ARRAY_A - result will be output as an numerically indexed array of associative arrays, using column names as keys.
ARRAY_N - result will be output as a numerically indexed array of numerically indexed arrays.  

Lihat: http://codex.wordpress.org/Class_Reference/wpdb


ini adalah satu-satunya cara yang disarankan di dunia WordPress.
Raptor

6

Saat mengonversi objek kelas STD menjadi array. Pindahkan objek ke array dengan menggunakan fungsi array php.

Cobalah dengan cuplikan kode berikut.

/*** cast the object ***/    
foreach($stdArray as $key => $value)
{
    $stdArray[$key] = (array) $value;
}   
/*** show the results ***/  
print_r( $stdArray );

Ini akan mengonversi objek luar menjadi larik, tetapi jika salah satu properti juga objek, mereka tidak akan dikonversi.
Coleman

Sesuai pertanyaan OP dia memiliki satu tingkat struktur objek. Untuk level berikutnya Anda harus menambahkan foreach loop lainnya.
NJInamdar

3

Anda bisa mencoba ini:

$aInitialArray = array_map(function($oObject){
    $aConverted = get_object_vars($oObject);
    return $aConverted['post_id'];
}, $aInitialArray);

1

Menggunakan ArrayObject dari Std atau membangunnya sendiri

(baru \ ArrayObject ($ existingStdClass))

Anda dapat menggunakan metode build in di kelas baru:

getArrayCopy ()

atau berikan objek baru ke

iterator_to_array


Jika $existingStdClassmemiliki properti yang lain stdClassmaka properti itu tetap menjadi stdClass dalam larik yang dihasilkan. Jika Anda membutuhkan sesuatu yang bekerja secara rekursif maka tampaknya Anda perlu menggunakan teknik json
Patrick

1

Mari kita asumsikan $ post_id adalah larik dari $ item

$post_id = array_map(function($item){

       return $item->{'post_id'};

       },$post_id);

teks yang kuat


1

Jika Anda memiliki elemen array dan array adalah stdClassitem maka ini adalah solusinya:

foreach($post_id as $key=>$item){
    $post_id[$key] = (array)$item;
}

sekarang stdClasstelah diganti dengan array di dalam array sebagai elemen array baru


1

Ada dua cara sederhana untuk mengonversi Objek stdClass menjadi Array

$array = get_object_vars($obj);

dan lainnya

$array = json_decode(json_encode($obj), true);

atau Anda cukup membuat array menggunakan foreach loop

$array = array();
foreach($obj as $key){
    $array[] = $key;
}
print_r($array);

0

Saya memiliki fungsi myOrderId($_GET['ID']);yang mengembalikan OBJ multidimensi. sebagai String .

Tak satu pun dari 1 liner lain yang bekerja untuk saya.

Ini keduanya berhasil:

$array = (array)json_decode(myOrderId($_GET['ID']), True);

$array = json_decode(json_decode(json_encode(myOrderId($_GET['ID']))), True);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.