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?

Dinesh
sumber
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;
Amal Murali
sumber
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);
Rey Ramos
sumber
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;
    }
}
Alessandro Minoccheri
sumber
1
Fungsi sempurna untuk mengubah objek st menjadi array
Vivek
16

Anda dapat mengonversi objek std menjadi array seperti ini:

$objectToArray = (array)$object;
Dinesh Kaswan
sumber
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;
}
Stack Overflow
sumber
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

Vlad
sumber
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 );
NJInamdar
sumber
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);
Sajuna Fernando
sumber
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

Desebal
sumber
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

varun sharma
sumber
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

softnwords
sumber
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);
Tayyab Hayat
sumber
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);
Cyborg
sumber