Bagaimana cara mengubah array ke objek di PHP?

367

Bagaimana saya bisa mengubah array seperti ini ke objek?

[128] => Array
    (
        [status] => Figure A.
 Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution.
    )

[129] => Array
    (
        [status] => The other day at work, I had some spare time
    )
streetparade
sumber
4
Objek apa yang ingin Anda dapatkan, tepatnya? Maksud saya adalah: apa yang harus menjadi atribut?
Pascal MARTIN
dalam satu lingkaran itu harus baik karena statusnya adalah satu array data sehingga keduanya printet
streetparade
tidak yakin sejak kapan, tetapi ini hanya berfungsi:$a = (object)['hello' => 'world'];
Nishchal Gautam

Jawaban:

588

Dalam kasus paling sederhana, itu mungkin cukup untuk "melemparkan" array sebagai objek:

$object = (object) $array;

Opsi lain adalah dengan instantiate kelas standar sebagai variabel, dan loop melalui array Anda saat menetapkan ulang nilai-nilai:

$object = new stdClass();
foreach ($array as $key => $value)
{
    $object->$key = $value;
}

Seperti yang ditunjukkan Edson Medina , solusi yang sangat bersih adalah dengan menggunakan json_fungsi bawaan:

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

Ini juga (secara rekursif) mengubah semua sub array Anda menjadi objek, yang mungkin atau mungkin tidak Anda inginkan. Sayangnya itu memiliki kinerja 2-3x hit atas pendekatan perulangan.

Peringatan! (terima kasih kepada Ultra untuk komentarnya):

json_decode pada lingkungan yang berbeda mengkonversi data UTF-8 dengan cara yang berbeda. Saya akhirnya mendapatkan nilai '240,00' secara lokal dan '240' pada produksi - bencana besar. Lebih lanjut jika konversi gagal, string dikembalikan sebagai NULL

jlb
sumber
41
"karena variabel tidak dapat dimulai dengan angka", ya mereka bisa: $ objek -> {3} = 'xyz';
chelmertz
11
"memiliki hit kinerja 2-3x" Yang merupakan perbandingan tidak adil, karena metode yang terakhir mengembalikan objek rekursif, sedangkan pendekatan perulangan tanpa kondisi lebih lanjut (seperti dalam jawaban @streetparade) hanya mengubah level pertama.
feeela
8
@feeela Saya tidak berpikir itu tidak adil sama sekali .. saya memang menyebutkan bahwa ia melakukan konversi secara rekursif. Juga, hit kinerja 2-3x tiba menggunakan array input datar (yang tidak akan menggunakan rekursi)
jlb
6
PERINGATAN! json_decode pada lingkungan yang berbeda mengkonversi data UTF-8 dengan cara yang berbeda. Saya akhirnya mendapatkan nilai '240,00' secara lokal dan '240' pada produksi - bencana besar. Selebihnya jika konversi gagal, string dapat dikembalikan sebagai NULL
Szymon Toda
1
Catatan ketika menggunakan fungsi json_ *: referensi (misalnya ke array lain) yang disimpan dalam array asli akan diduplikasi dalam kasus ini. Katakanlah kunci xdalam array menyimpan referensi ke array lain. Kemudian $object->xsetelah eksekusi one-liner Anda akan menjadi duplikat $array['x'], bukan lagi referensi ke array asli. Ini mungkin tidak berbahaya di beberapa aplikasi, tetapi untuk array besar itu membuang-buang memori dan mungkin mengacaukan eksekusi jika referensi sedang digunakan nanti.
The Coprolal
153

Anda cukup menggunakan tipe casting untuk mengubah array menjadi objek.

// *convert array to object* Array([id]=> 321313[username]=>shahbaz)
$object = (object) $array_name;

//now it is converted to object and you can access it.
echo $object->username;
Shahbaz
sumber
107

Cara mudahnya adalah

$object = (object)$array;

Tetapi bukan itu yang Anda inginkan. Jika Anda menginginkan objek, Anda ingin mencapai sesuatu, tetapi itu tidak ada dalam pertanyaan ini. Menggunakan objek hanya karena alasan menggunakan objek tidak masuk akal.

johannes
sumber
2
doesnt bekerja, saya melakukan itu sebelum saya mengajukan pertanyaan di sini sehingga harus ada cara lain untuk Receh
streetparade
20
Kenapa dia harus memberikan alasannya ingin menggunakan benda? Saya tidak berpikir itu relevan dengan bagaimana hal itu dilakukan. Mungkin dia perlu json_encode mereka, atau membuat serial mereka? Mungkin ada lusinan alasan untuk melakukan ini.
Zombat
hmm .. saya melihat output browser sepertinya objek ini (stdClass) # 150 (130) {[0] => array (1) {["status"] => string (130) "Pada akhirnya Mac dan Pengguna Linux tidak harus merasa seperti warga negara kelas dua di tanah Chrome: mereka punya beta versio resmi ... "} resmi yang merupakan objek tetapi bagaimana untuk mengulangi lemparan ini agar saya dapat mengakses status seperti $ obj-> status ide apa pun ?
streetparade
zombat, JSON encode tidak ada alasan untuk menggunakan objek, ada flag ke json_encode () untuk menggunakan objek. dengan cerita bersambung satu akan membutuhkan jenis objek tertentu yang diharapkan oleh penerima. Dan secara umum saya mencoba membantu dengan masalah yang sebenarnya . bagi saya pertanyaan ini menyiratkan bahwa ada kesalahan arsitektur di tempat lain.
johannes
bagus, bekerja dengan laravel array ke objek masalah
Anthony Kal
105

Retas cepat:

// assuming $var is a multidimensional array
$obj = json_decode (json_encode ($var), FALSE);

Tidak cantik, tapi berhasil.

Edson Medina
sumber
2
Saya benar-benar menyukai solusi ini, menggunakan fungsi built-in alih-alih yang ditentukan pengguna selalu lebih cepat, dan ini berfungsi dengan baik. Terima kasih atas tipnya.
aknatn
@Oddant Ini memecahkan masalah yang disebutkan di atas (mengubah array menjadi objek). Kata-kata kasar Anda harus diarahkan ke pos utama, bukan solusi saya.
Edson Medina
@ EdsonMedina saya lakukan, posting saya terlalu turun.
vdegenne
1
@Oddant, agar adil kepada @EdsonMedina, pertanyaan awal tidak menentukan visibilitas apa yang dibutuhkan atribut, dan karena OP tidak menggunakan $thiskomentar yang mengikuti sebagai pengakses, ini sangat tersirat ia menginginkan stdClassinstance sebagai output dan tidak kelas yang ditentukan pengguna seperti penggunaan jawaban Anda. Saya setuju dengan keanggunan solusi ini, tetapi sayangnya itu adalah pola yang cukup umum digunakan untuk menyelesaikan masalah ini dengan array bersarang di mana casting ke objek tidak akan bekerja. Mungkin juga OP menggunakan antarmuka yang membutuhkan dan objek sebagai input dan bukan array.
DeaconDesperado
3
Jangan lupa bahwa dengan menggunakan cara ini Anda akan kehilangan semua kecuali tipe dasar. DateTime akan menjadi konverter stdObject misalnya.
Denis Pshenov
97

Berikut ini tiga cara:

  1. Palsu objek nyata:

    class convert
    {
        public $varible;
    
        public function __construct($array)
        {
            $this = $array;
        }
    
        public static function toObject($array)
        {
            $array = new convert($array);
            return $array;
        }
    }
    
  2. Konversikan array menjadi objek dengan melemparkannya ke objek:

    $array = array(
        // ...
    );
    $object = (object) $array;
    
  3. Konversi array menjadi objek secara manual:

    $object = object;
    foreach ($arr as $key => $value) {
        $object->{$key} = $value;
    }
    
Julius F
sumber
2
hmm terima kasih tetapi kelas wajah Anda memberikan kesalahan berikut Kesalahan fatal: Tidak dapat menetapkan ulang $ this di /var/www/bot/inc/twitter-bot.php pada jalur 10
streetparade
1
dan typcasint @ referensi bukan ide yang baik bahkan tidak akan bekerja di sini adalah apa yang saya dapatkan T_OBJECT_CAST yang tidak terduga, mengharapkan T_NEW atau T_STRING atau T_VARIABLE atau '$'
streetparade
2
$ array = & (objek) $ array == implementasi KISS yang bagus!
mate64
16
Mengapa ada orang yang ingin menggunakan metode yang berbeda dari 2)? Apakah ada kerugian?
Yogu
7
mengetikkan array ke objek tidak bekerja pada array bersarang
minhajul
34

Caranya sederhana, Ini akan membuat objek untuk array rekursif juga:

$object = json_decode(json_encode((object) $yourArray), FALSE);
star18bit
sumber
4
meneruskan falseke json_decode()akan mengembalikan array asosiatif.
Karat
3
@ user3284463 Melewati trueuntuk json_decodeakan mengembalikan array asosiatif, falseadalah default dan akan mengembalikan StdClassinstance.
Elliot Reed
23

Tergantung di mana Anda membutuhkannya dan bagaimana mengakses objek ada berbagai cara untuk melakukannya.

Misalnya: cukup ketik saja

$object =  (object) $yourArray;

Namun, yang paling kompatibel adalah menggunakan metode utilitas (belum menjadi bagian dari PHP) yang mengimplementasikan casting PHP standar berdasarkan string yang menentukan jenis (atau dengan mengabaikannya hanya de-referensi nilai):

/**
 * dereference a value and optionally setting its type
 *
 * @param mixed $mixed
 * @param null  $type (optional)
 *
 * @return mixed $mixed set as $type
 */
function rettype($mixed, $type = NULL) {
    $type === NULL || settype($mixed, $type);
    return $mixed;
}

Contoh penggunaan dalam kasus Anda ( Demo Online ):

$yourArray = Array('status' => 'Figure A. ...');

echo rettype($yourArray, 'object')->status; // prints "Figure A. ..."
hakre
sumber
17

Yang ini berhasil untuk saya

  function array_to_obj($array, &$obj)
  {
    foreach ($array as $key => $value)
    {
      if (is_array($value))
      {
      $obj->$key = new stdClass();
      array_to_obj($value, $obj->$key);
      }
      else
      {
        $obj->$key = $value;
      }
    }
  return $obj;
  }

function arrayToObject($array)
{
 $object= new stdClass();
 return array_to_obj($array,$object);
}

penggunaan:

$myobject = arrayToObject($array);
print_r($myobject);

pengembalian:

    [127] => stdClass Object
        (
            [status] => Have you ever created a really great looking website design
        )

    [128] => stdClass Object
        (
            [status] => Figure A.
 Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution.
        )

    [129] => stdClass Object
        (
            [status] => The other day at work, I had some spare time
        )

seperti biasa Anda dapat mengulanginya seperti:

foreach($myobject as $obj)
{
  echo $obj->status;
}
streetparade
sumber
Tapi yang ini sekitar 500% lebih lambat (diuji) daripada tipe casting: $ obj = (objek) $ array;
xZero
@xZero tetapi $obj = (object) $array;tidak berfungsi untuk array multidimensi.
Jeff Puckett
15

Tidak ada metode bawaan untuk melakukannya sejauh yang saya ketahui, tetapi semudah loop sederhana:

    $obj= new stdClass();

    foreach ($array as $k=> $v) {
        $obj->{$k} = $v;
    }

Anda dapat menguraikan hal itu jika Anda membutuhkannya untuk membangun objek Anda secara rekursif.

zombat
sumber
14

Anda dapat menggunakan fungsi (objek) untuk mengubah array Anda menjadi objek.

$arr= [128=> ['status'=>
                 'Figure A. Facebook \'s horizontal scrollbars showing up on a 1024x768 screen resolution.'],
                  129=>['status'=>'The other day at work, I had some spare time']];

            $ArrToObject=(object)$arr;
            var_dump($ArrToObject);

Hasilnya akan menjadi objek yang berisi array:

object (stdClass) # 1048 (2) {[128] => array (1) {

["status"] => string (87) "Gambar A. Bilah gulir horizontal Facebook muncul pada resolusi layar 1024x768." }

[129] => array (1) {["status"] => string (44) "Suatu hari di tempat kerja, saya punya waktu luang"}}

Noha Shehab
sumber
9

Sebenarnya jika Anda ingin menggunakan ini dengan array multi-dimensi Anda ingin menggunakan beberapa rekursi.

static public function array_to_object(array $array)
{
    foreach($array as $key => $value)
    {
        if(is_array($value))
        {
            $array[$key] = self::array_to_object($value);
        }
    }
    return (object)$array;
}
Nezzy
sumber
8

Saya pasti akan pergi dengan cara bersih seperti ini:

<?php

class Person {

  private $name;
  private $age;
  private $sexe;

  function __construct ($payload)
  {
     if (is_array($payload))
          $this->from_array($payload);
  }


  public function from_array($array)
  {
     foreach(get_object_vars($this) as $attrName => $attrValue)
        $this->{$attrName} = $array[$attrName];
  }

  public function say_hi ()
  {
     print "hi my name is {$this->name}";
  }
}

print_r($_POST);
$mike = new Person($_POST);
$mike->say_hi();

?>

jika Anda mengirimkan:

formulaire

Anda akan mendapatkan ini:

mikrofon

Saya menemukan ini lebih logis membandingkan jawaban di atas dari Objects harus digunakan untuk tujuan mereka telah dibuat (dikemas objek kecil yang lucu).

Juga menggunakan get_object_vars memastikan bahwa tidak ada atribut tambahan yang dibuat di Objek yang dimanipulasi (Anda tidak ingin mobil yang memiliki nama keluarga, atau orang yang berperilaku 4 roda).

vdegenne
sumber
Mengapa Anda tidak menggunakan $ attr_value alih-alih $ array [$ attr_name]; dalam fungsi publik Anda from_array ($ array) function
Sakkeer Hussain
7

Anda juga dapat menggunakan ArrayObject, misalnya:

<?php
    $arr = array("test",
                 array("one"=>1,"two"=>2,"three"=>3), 
                 array("one"=>1,"two"=>2,"three"=>3)
           );
    $o = new ArrayObject($arr);
    echo $o->offsetGet(2)["two"],"\n";
    foreach ($o as $key=>$val){
        if (is_array($val)) {
            foreach($val as $k => $v) {
               echo $k . ' => ' . $v,"\n";
            }
        }
        else
        {
               echo $val,"\n";
        }
    }
?>

//Output:
  2
  test
  one => 1
  two => 2
  three => 3
  one => 1
  two => 2
  three => 3
slevy1
sumber
1
Menurut pendapat saya ini harus menjadi jawaban terbaik. Info lebih lanjut di sini: php.net/manual/en/arrayobject.construct.php
Julian
7

Yang saya gunakan (ini adalah anggota kelas):

const MAX_LEVEL = 5; // change it as needed

public function arrayToObject($a, $level=0)
{

    if(!is_array($a)) {
        throw new InvalidArgumentException(sprintf('Type %s cannot be cast, array expected', gettype($a)));
    }

    if($level > self::MAX_LEVEL) {
        throw new OverflowException(sprintf('%s stack overflow: %d exceeds max recursion level', __METHOD__, $level));
    }

    $o = new stdClass();
    foreach($a as $key => $value) {
        if(is_array($value)) { // convert value recursively
            $value = $this->arrayToObject($value, $level+1);
        }
        $o->{$key} = $value;
    }
    return $o;
}
TimSparrow
sumber
7

Sedikit rumit tapi mudah untuk memperpanjang teknik:

Misalkan Anda memiliki array

$a = [
     'name' => 'ankit',
     'age' => '33',
     'dob' => '1984-04-12'
];

Misalkan Anda memiliki kelas Person yang mungkin memiliki atribut lebih atau kurang dari array ini. sebagai contoh

class Person 
{
    private $name;
    private $dob;
    private $age;
    private $company;
    private $city;
}

Jika Anda masih ingin mengubah array Anda ke objek orang. Anda dapat menggunakan Kelas ArrayIterator.

$arrayIterator = new \ArrayIterator($a); // Pass your array in the argument.

Sekarang Anda memiliki objek iterator.

Buat kelas memperluas Kelas FilterIterator; di mana Anda harus mendefinisikan metode abstrak terima. Ikuti contohnya

class PersonIterator extends \FilterIterator
{
    public function accept()
    {
        return property_exists('Person', parent::current());
    }
}

Impelmentasi di atas akan mengikat properti hanya jika ada di kelas.

Tambahkan satu metode lagi di kelas PersonIterator

public function getObject(Person $object)
{
        foreach ($this as $key => $value)
        {
            $object->{'set' . underscoreToCamelCase($key)}($value);
        }
        return $object;
}

Pastikan Anda memiliki mutator yang ditentukan di kelas Anda. Sekarang Anda siap memanggil fungsi ini di mana Anda ingin membuat objek.

$arrayiterator = new \ArrayIterator($a);
$personIterator = new \PersonIterator($arrayiterator);

$personIterator->getObject(); // this will return your Person Object. 
Ankit Vishwakarma
sumber
6

rekursi adalah teman Anda:

function __toObject(Array $arr) {
    $obj = new stdClass();
    foreach($arr as $key=>$val) {
        if (is_array($val)) {
            $val = __toObject($val);
        }
        $obj->$key = $val;
    }

    return $obj;
}
minhajul
sumber
6

Ini membutuhkan PHP7 karena saya memilih untuk menggunakan fungsi lambda untuk mengunci 'fungsi dalam' di dalam fungsi utama. Fungsi lambda disebut rekursif, maka kebutuhan untuk: "use (& $ innerfunc)". Anda bisa melakukannya di PHP5 tetapi tidak bisa menyembunyikan fungsi dalam.

function convertArray2Object($defs) {
    $innerfunc = function ($a) use ( &$innerfunc ) {
       return (is_array($a)) ? (object) array_map($innerfunc, $a) : $a; 
    };
    return (object) array_map($innerfunc, $defs);
}
Chris Jeffries
sumber
5

gunakan fungsi ini yang saya buat:

function buildObject($class,$data){
    $object = new $class;
    foreach($data as $key=>$value){
        if(property_exists($class,$key)){
            $object->{'set'.ucfirst($key)}($value);
        }
    }
    return $object;
}

Pemakaian:

$myObject = buildObject('MyClassName',$myArray);
Douraid Arfaoui
sumber
5

satu liner

$object= json_decode(json_encode($result_array, JSON_FORCE_OBJECT));
YesItsMe
sumber
1
Perhatikan bahwa referensi (mis. Ke array lain) yang disimpan dalam array asli akan diduplikasi oleh liner satu ini. Katakanlah kunci xdalam array menyimpan referensi ke array lain. Kemudian $object->xsetelah eksekusi one-liner Anda akan menjadi duplikat $result_array['x'], bukan array yang identik.
The Coprolal
4

Mudah:

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

Contoh:

$array = array(
    'key' => array(
        'k' => 'value',
    ),
    'group' => array('a', 'b', 'c')
);

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

Kemudian, yang berikut ini benar:

$object->key->k === 'value';
$object->group === array('a', 'b', 'c')
Eduardo Cuomo
sumber
1
Saya pikir ini solusinya. Mengapa menyandikan array ke json dan kemudian mendekodekannya? Ini bukan keputusan yang optimal bagi saya.
Julian
1
@Julian, karena ia bekerja secara rekursif, melakukannya dengan cara yang didefinisikan dengan baik dan cukup dapat diandalkan ("standar"), dan juga cukup cepat untuk menjadi alternatif yang baik untuk sihir monyet kode tangan acak.
Sz.
3

Anda juga bisa melakukan ini dengan menambahkan (objek) di sebelah kiri variabel untuk membuat objek baru.

<?php
$a = Array
    ( 'status' => " text" );
var_dump($a);
$b = (object)$a;
var_dump($b);
var_dump($b->status);

http://codepad.org/9YmD1KsU

fedmich
sumber
1
mungkin layak disebut ini disebut "casting" atau "type casting": php.net/manual/en/… dan perilaku array (objek) () didokumentasikan di sini: php.net/manual/en/…
Pete
2

Penggunaan json_encodebermasalah karena cara menangani data non UTF-8. Perlu dicatat bahwa json_encode/ json_encodemetode juga meninggalkan array non-asosiatif sebagai array. Ini mungkin atau mungkin bukan yang Anda inginkan. Saya baru-baru ini dalam posisi perlu menciptakan kembali fungsionalitas dari solusi ini tetapi tanpa menggunakan json_fungsi. Inilah yang saya pikirkan:

/**
 * Returns true if the array has only integer keys
 */
function isArrayAssociative(array $array) {
    return (bool)count(array_filter(array_keys($array), 'is_string'));
}

/**
 * Converts an array to an object, but leaves non-associative arrays as arrays. 
 * This is the same logic that `json_decode(json_encode($arr), false)` uses.
 */
function arrayToObject(array $array, $maxDepth = 10) {
    if($maxDepth == 0) {
        return $array;
    }

    if(isArrayAssociative($array)) {
        $newObject = new \stdClass;
        foreach ($array as $key => $value) {
            if(is_array($value)) {
                $newObject->{$key} = arrayToObject($value, $maxDepth - 1);
            } else {
                $newObject->{$key} = $value;
            }
        }
        return $newObject;
    } else {

        $newArray = array();
        foreach ($array as $value) {
            if(is_array($value)) {
                $newArray[] = arrayToObject($value, $maxDepth - 1);
            } else {
                $newArray[] = $value;
            }                
        }
        return $newArray;
    }
}
DavidH
sumber
2

Metode Terbaik di DUNIA :)

function arrayToObject($conArray)
{
    if(is_array($conArray)){
        /*
        * Return array converted to object
        * Using __FUNCTION__ (Magic constant)
        * for recursive call
        */
        return (object) array_map(__FUNCTION__, $conArray);
    }else{
        // Return object
        return $conArray;
    }
}

jika Anda menggunakan metode yang berbeda, Anda akan memiliki masalah. Ini adalah metode terbaik. Kamu pernah melihat.

Zezeron
sumber
2

Array multidimensi menjadi suatu objek. kode ini digunakan untuk konversi metode pencarian dan penangkapan API pencarian Bing.

try {
        // Perform the Web request and get the JSON response
        $context = stream_context_create($options);
        $results = file_get_contents($url . "?cc=" . $country . "&category=" . $type, false, $context);
        $results = json_decode($results);
        return response()->json($results);
    } catch (\Exception $e) {
        $results = array('value' => array(
                (object) array(
                    "name" => "Unable to Retrive News",
                    "url" => "http://www.sample.com/",
                    "image" => (object) array("thumbnail" => (object) array("contentUrl" => "")),
                    "publishedAt" => "",
                    "description" => "")
            )
        );
        $results = (object) $results;
        return response()->json($results);
    }
Krishnamoorthy Acharya
sumber
2

Anda dapat menggunakan Refleksi:

<?php

$array = ['name'=>'maria','age'=>33];

class Person {

    public $name;
    public $age;

    public function __construct(string $name, string $age){
        $this->name  = $name;
        $this->age = $age;
    }
}

function arrayToObject(array $array, string $class_name){

    $r = new ReflectionClass($class_name);
    $object = $r->newInstanceWithoutConstructor();
    $list = $r->getProperties();
    foreach($list as $prop){
      $prop->setAccessible(true);
      if(isset($array[$prop->name]))
        $prop->setValue($object, $array[$prop->name]);
    } 

    return $object;

}

$pessoa1 = arrayToObject($array, 'Person');
var_dump($pessoa1);
celsowm
sumber
1

CakePHP memiliki kelas Set :: map rekursif yang pada dasarnya memetakan array ke objek. Anda mungkin perlu mengubah seperti apa rupa array agar objek terlihat seperti yang Anda inginkan.

http://api.cakephp.org/view_source/set/#line-158

Kasus terburuk, Anda mungkin bisa mendapatkan beberapa ide dari fungsi ini.

Dooltaz
sumber
1

Jelas hanya ekstrapolasi jawaban beberapa orang lain, tapi inilah fungsi rekursif yang akan mengubah array dimensi mulsa menjadi objek:

   function convert_array_to_object($array){
      $obj= new stdClass();
      foreach ($array as $k=> $v) {
         if (is_array($v)){
            $v = convert_array_to_object($v);   
         }
         $obj->{strtolower($k)} = $v;
      }
      return $obj;
   }

Dan ingat bahwa jika array memiliki tombol angka mereka masih bisa dirujuk dalam objek yang dihasilkan dengan menggunakan {}(misalnya: $obj->prop->{4}->prop)

Ben D
sumber
1

Terinspirasi oleh semua kode ini, saya mencoba membuat versi yang disempurnakan dengan dukungan untuk: nama kelas tertentu, menghindari metode konstruktor, pola 'kacang' dan mode ketat (hanya set properti yang ada):

    class Util {

static function arrayToObject($array, $class = 'stdClass', $strict = false) {
        if (!is_array($array)) {
            return $array;
        }

        //create an instance of an class without calling class's constructor
        $object = unserialize(
                sprintf(
                        'O:%d:"%s":0:{}', strlen($class), $class
                )
        );

        if (is_array($array) && count($array) > 0) {
            foreach ($array as $name => $value) {
                $name = strtolower(trim($name));
                if (!empty($name)) {

                    if(method_exists($object, 'set'.$name)){
                        $object->{'set'.$name}(Util::arrayToObject($value));
                    }else{
                        if(($strict)){

                            if(property_exists($class, $name)){

                                $object->$name = Util::arrayToObject($value); 

                            }

                        }else{
                            $object->$name = Util::arrayToObject($value); 
                        }

                    }

                }
            }
            return $object;
        } else {
            return FALSE;
        }
        }
}
celsowm
sumber
1

Kode

Fungsi ini berfungsi sama dengan json_decode(json_encode($arr), false).

function arrayToObject(array $arr)
{
    $flat = array_keys($arr) === range(0, count($arr) - 1);
    $out = $flat ? [] : new \stdClass();

    foreach ($arr as $key => $value) {
        $temp = is_array($value) ? $this->arrayToObject($value) : $value;

        if ($flat) {
            $out[] = $temp;
        } else {
            $out->{$key} = $temp;
        }
    }

    return $out;
}

Pengujian

Tes 1: Array datar

$arr = ["a", "b", "c"];
var_export(json_decode(json_encode($arr)));
var_export($this->arrayToObject($arr));

Keluaran:

array(
    0 => 'a',
    1 => 'b',
    2 => 'c',
)
array(
    0 => 'a',
    1 => 'b',
    2 => 'c',
)

Tes 2: Array objek

$arr = [["a" => 1], ["a" => 1], ["a" => 1]];
var_export(json_decode(json_encode($arr)));
var_export($this->arrayToObject($arr));

Keluaran:

array(
    0 => stdClass::__set_state(array('a' => 1,)),
    1 => stdClass::__set_state(array('a' => 1,)),
    2 => stdClass::__set_state(array('a' => 1,)),
)
array(
    0 => stdClass::__set_state(array('a' => 1,)),
    1 => stdClass::__set_state(array('a' => 1,)),
    2 => stdClass::__set_state(array('a' => 1,)),
)

Tes 3: Objek

$arr = ["a" => 1];
var_export(json_decode($arr));
var_export($this->arrayToObject($arr));

Keluaran:

stdClass::__set_state(array('a' => 1,))
stdClass::__set_state(array('a' => 1,))
acelot
sumber
0

saya telah melakukannya dengan cara yang cukup sederhana,

    $list_years         = array();
    $object             = new stdClass();

    $object->year_id   = 1 ;
    $object->year_name = 2001 ;
    $list_years[]       = $object;
Muhammad
sumber