PHP'de bir diziyi nesneye dönüştürme


367

Böyle bir diziyi nesneye nasıl dönüştürebilirim?

[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
    )

4
Tam olarak ne tür bir nesne elde etmek istiyorsunuz? Ne demek istiyorum: özellikleri ne olmalı?
Pascal MARTIN

bir döngü içinde her ikisi de gerekir çünkü durumu bir veri dizisi olduğundan her ikisi de printet
streetparade

ne zaman emin değilim, ama bu sadece işe yarıyor:$a = (object)['hello' => 'world'];
Nishchal Gautam

Yanıtlar:


588

En basit durumda, diziyi bir nesne olarak "yayınlamak" muhtemelen yeterlidir:

$object = (object) $array;

Başka bir seçenek, standart sınıfı değişken olarak başlatmak ve değerleri yeniden atarken diziniz arasında döngü yapmaktır:

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

Edson Medina'nın belirttiği gibi , gerçekten temiz bir çözüm yerleşik json_işlevleri kullanmaktır:

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

Bu ayrıca (yinelemeli olarak) tüm alt dizilerinizi isteyebileceğiniz veya istemeyeceğiniz nesnelere dönüştürür. Ne yazık ki , döngü yaklaşımı üzerinde 2-3 kat bir performans isabeti var.

Uyarı! (yorum için Ultra'ya teşekkürler):

Farklı ortamlardaki json_decode, UTF-8 verilerini farklı şekillerde dönüştürür. Sonunda yerel olarak '240.00' ve üretimde '240' değerlerine ulaşıyorum - büyük çaplı dissaster. Dönüşüm dize başarısız olursa morover get NULL olarak döndürülür


41
"değişkenler sayılarla başlayamaz", evet yapabilirler: $ object -> {3} = 'xyz';
chelmertz

11
"2-3x performans isabeti vardır" Bu ikinci yöntem özyinelemeli nesneler döndürdüğü için haksız bir karşılaştırmadır, başka koşullar olmadan (@streetparade cevabında olduğu gibi) döngü yaklaşımı yalnızca ilk düzeyi dönüştürür.
feeela

8
@feeela Ben hiç haksız olduğunu sanmıyorum .. dönüşüm tekrar tekrar yaptığı bahsetti. Ayrıca, 2-3x performans isabeti, düz bir giriş dizisi kullanılarak (herhangi bir özyineleme kullanmaz) geldi
jlb

6
UYARI! Farklı ortamlardaki json_decode, UTF-8 verilerini farklı şekillerde dönüştürür. Sonunda yerel olarak '240.00' değerlerine ve üretimde '240' değerlerine ulaşıyorum - büyük çaplı dissaster. Dönüşüm başarısız olursa morover string get NULL olarak döndürülür
Szymon Toda

1
Not json_ * fonksiyonlarını kullanırken: orijinal dizide saklanan referanslar (örn. Diğer dizilere) bu durumda çoğaltılacaktır. Dizideki anahtarın xbaşka bir diziye başvuru içerdiğini varsayalım. Daha $object->xsonra, bir astarınızın yürütülmesinden sonra $array['x'], orijinal diziye artık bir referans değil, bir kopyası olacaktır . Bu, bazı uygulamalarda zararsız olabilir, ancak büyük diziler için bellek harcar ve referans daha sonra kullanılıyorsa yürütmeyi bozabilir.
Coprolal

153

bir diziyi nesneye dönüştürmek için tür dökümünü kullanabilirsiniz.

// *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;

107

Kolay yol

$object = (object)$array;

Ama istediğin bu değil. Nesneler istiyorsanız, bir şey elde etmek istiyorsunuz, ancak bu soruda bu eksik. Nesneleri yalnızca nesne kullanma nedeni ile kullanmak mantıklı değildir.


2
çalışmıyor, doit için başka bir yol olmalı bu yüzden burada soru
sormadan

20
Neden nesneleri kullanmak isteme sebebi vermek zorunda? Bunun nasıl yapıldığıyla alakalı olduğunu düşünmüyorum . Belki de onları json_encode veya serileştirmesi gerekiyor? Bunu yapmak için onlarca neden olabilir.
zombat

hmm .. tarayıcı çıktısına baktım bu nesne gibi görünüyor (stdClass) # 150 (130) {[0] => dizi (1) {["status"] => string (130) "Uzun süredir Mac ve Linux kullanıcıları Chrome topraklarında ikinci sınıf vatandaş gibi hissetmek zorunda değiller: Resmi beta sürümü var… "} Bu bir nesne ama resmi olarak itiraz edeceğim, $ obj-> status gibi statüye erişebilirim ?
streetparade

zombat, JSON kodlaması bir nesneyi kullanmak için bir neden değildir, nesneleri kullanmak için json_encode () için bir bayrak vardır. serialize ile bir alıcı tarafından beklenen belirli bir nesne türü gerekir. Genel olarak asıl soruna yardım etmeye çalışıyorum . benim için bu soru başka bir yerde mimari bir hata olduğunu ima ediyor.
johannes

güzel bir, konu itiraz laravel dizi ile çalışmak
Anthony Kal

105

Hızlı kesmek:

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

Güzel değil, ama çalışıyor.


2
Aslında bu çözümü seviyorum, kullanıcı tanımlı yerine yerleşik işlevleri kullanmak her zaman daha hızlıdır ve bu harika çalışır. Bahşiş için teşekkürler.
aknatn

@Oddant Bu, yukarıda belirtilen sorunu çözer (bir diziyi bir nesneye dönüştürür). Senin rant benim çözüm değil, ana yazıya yönlendirilmelidir.
Edson Medina

@EdsonMedina Yaptım, benim posta olsa çok aşağı.
vdegenne

1
@Oddant, @EdsonMedina'ya karşı dürüst olmak gerekirse, orijinal soru, özelliklerin hangi görünüme ihtiyacı olduğunu belirtmez ve OP $this, erişimci olarak takip eden yorumlarda kullanmadığından , bir stdClassörneği çıktı olarak değil cevabınızın kullandığı gibi kullanıcı tanımlı bir sınıf. Bu çözümün şıklığına katılıyorum ama maalesef bu sorunu nesneye dökmenin işe yaramayacağı iç içe dizilerle çözmek için oldukça yaygın olarak kullanılan bir model. OP'nin bir dizi yerine giriş olarak gerektiren ve nesne olarak bir arabirim kullanması da mümkündür.
DeaconDesperado

3
Bu şekilde kullandığınızda temel türler dışında hepsini kaybedeceğinizi unutmayın. DateTime örneğin dönüştürücü stdObject olacaktır.
Denis Pshenov

97

İşte üç yol:

  1. Sahte gerçek bir nesne:

    class convert
    {
        public $varible;
    
        public function __construct($array)
        {
            $this = $array;
        }
    
        public static function toObject($array)
        {
            $array = new convert($array);
            return $array;
        }
    }
  2. Diziyi bir nesneye çevirerek nesneye dönüştürün:

    $array = array(
        // ...
    );
    $object = (object) $array;
  3. Diziyi manuel olarak bir nesneye dönüştürün:

    $object = object;
    foreach ($arr as $key => $value) {
        $object->{$key} = $value;
    }

2
hmm teşekkürler ama yüz sınıfınız aşağıdaki hatayı veriyor Ölümcül hata: 10 satırındaki /var/www/bot/inc/twitter-bot.php
dosyasında

1
ve typcasint @ başvuru burada işe yaramaz bile iyi bir fikir değil, beklenmedik bir şey var T_OBJECT_CAST, T_NEW veya T_STRING veya T_VARIABLE veya '$' bekliyor
streetparade

2
$ array = & (nesne) $ array == güzel KISS uygulaması!
mate64

16
Neden kimse 2) 'den farklı bir yöntem kullanmak istesin ki? Herhangi bir dezavantajı var mı?
Yogu

7
bir dizinin nesneye
yazılması

34

Basit yolu, Yinelemeli diziler için de bir nesne oluşturur:

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

4
geçen falseiçin json_decode()bir ilişkisel dizi döndürür.
Rust

3
@ user3284463 Geçiş trueyapmak json_decodeilişkilendirilebilir bir dizi döndürür false, varsayılan değerdir ve bir StdClassörnek döndürür .
Elliot Reed

23

Buna ihtiyacınız olan yere ve nesneye nasıl erişeceğinize bağlı olarak, bunu yapmanın farklı yolları vardır.

Örneğin: sadece yazın

$object =  (object) $yourArray;

Bununla birlikte, en uyumlu olanı, türü belirten bir dizeye dayalı olarak standart PHP dökümünü uygulayan bir yardımcı yöntem (henüz PHP'nin bir parçası değil) kullanmaktır (veya yalnızca değeri referans alarak yok sayarak):

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

Sizin durumunuzdaki kullanım örneği ( Çevrimiçi Demo ):

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

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

17

Bu benim için çalıştı

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

kullanım:

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

İadeler :

    [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
        )

her zamanki gibi döngü yapabilirsiniz:

foreach($myobject as $obj)
{
  echo $obj->status;
}

Ancak bu, döküm türüne göre yaklaşık% 500 daha yavaştır (test edilmiştir): $ obj = (object) $ array;
xZero

@xZero ancak $obj = (object) $array;çok boyutlu dizilerde çalışmaz.
Jeff Puckett

15

Bunu bildiğim kadarıyla yapmak için yerleşik bir yöntem yok, ancak basit bir döngü kadar kolay:

    $obj= new stdClass();

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

Nesnenizi özyinelemeli olarak oluşturmanız gerekiyorsa buna açıklayabilirsiniz.


14

Dizinizi bir nesneye dönüştürmek için (object) işlevini kullanabilirsiniz.

$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);

Sonuç diziler içeren bir nesne olacaktır:

nesne (stdClass) # 1048 (2) {[128] => dizi (1) {

["status"] => string (87) "Şekil A. 1024x768 ekran çözünürlüğünde görünen Facebook'un yatay kaydırma çubukları." }

[129] => dizi (1) {["status"] => string (44) "Geçen gün işte boş vaktim vardı"}}


9

Aslında bunu çok boyutlu dizilerle kullanmak istiyorsanız, tekrarlama kullanmak istersiniz.

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

8

Kesinlikle böyle temiz bir yolla gitmek istiyorum:

<?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();

?>

eğer gönderirseniz:

formulaire

bunu alacaksınız:

mikrofon

Bu daha mantıklı buldum Nesnelerin yukarıdaki cevapları için yapıldıkları amaç için kullanılmalıdır (kapsüllenmiş sevimli küçük nesneler).

Ayrıca get_object_vars komutunu kullanmak, manipüle edilen Nesne'de ekstra özellik oluşturulmamasını sağlar (soyadı olan bir arabanın veya 4 tekerlekli davranan bir kişinin olmasını istemezsiniz).


Neden $ array [$ attr_name] yerine $ attr_value kullanmıyorsunuz; kamu fonksiyonunuzda from_array ($ array) işlevi
Sakkeer Hussain

7

Bir ArrayObject de kullanabilirsiniz, örneğin:

<?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

1
Bence bu en iyi cevap olmalı. Daha fazla bilgi herre
Julian

7

Kullandığım (bir sınıf üyesi):

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

7

Az karmaşık ancak genişletilmesi kolay teknik:

Bir diziniz olduğunu varsayalım

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

Bu diziden daha fazla veya daha az özniteliği olabilecek bir Person sınıfınız olduğunu varsayalım. Örneğin

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

Dizinizi hala kişi nesnesine değiştirmek istiyorsanız. ArrayIterator Sınıfını kullanabilirsiniz.

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

Şimdi yineleyici nesneniz var.

FilterIterator Sınıfını genişleten bir sınıf oluşturun; Burada soyut yöntemi tanımlamanız gerekir kabul. Örneği takip edin

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

Yukarıdaki impelmentation özelliği yalnızca sınıfta varsa bağlar.

PersonIterator sınıfına bir yöntem daha ekleyin

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

Sınıfınızda tanımlı mutatör bulunduğundan emin olun. Artık nesne oluşturmak istediğiniz bu işlevi çağırmaya hazırsınız.

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

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

6

özyineleme senin arkadaşın:

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

    return $obj;
}

6

Ana işlevi içinde 'innerfunc' kilitlemek için bir lambda işlevi kullanmayı seçti çünkü bu PHP7 gerektirir. Lambda işlevi özyinelemeli olarak adlandırılır, bu nedenle şunlara ihtiyaç vardır: "use (& $ innerfunc)". PHP5 ile yapabilirsiniz ama innerfunc gizlemek olamazdı.

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

5

yaptığım bu işlevi kullanın:

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

Kullanımı:

$myObject = buildObject('MyClassName',$myArray);

5

bir astar

$object= json_decode(json_encode($result_array, JSON_FORCE_OBJECT));

1
Orijinal dizide depolanan referansların (örn. Diğer dizilere) bu tek satırla çoğaltılacağını unutmayın. Dizideki anahtarın xbaşka bir diziye başvuru içerdiğini varsayalım. Daha $object->xsonra tek astarınızın çalıştırılmasından sonra $result_array['x'], aynı dizinin kopyası değil, kopyası olacaktır .
Coprolal

4

Kolay:

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

Misal:

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

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

Sonra, aşağıdakiler doğrudur:

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

1
Bunun bir çözüm olduğunu düşünüyorum. Neden bir diziyi json'a kodlayıp kodunu çözelim? Benim için uygun bir karar değil.
Julian

1
@Julian, özyinelemeli olarak çalıştığı için, düzgün tanımlanmış ve yeterince güvenilir ("standart") bir şekilde yapar ve rastgele elle kodlanmış maymun büyüsüne iyi bir alternatif olacak kadar hızlıdır.
Sz.


2

json_encodeUTF-8 olmayan verileri işleme biçimi nedeniyle kullanmak sorunludur. json_encode/ json_encodeYönteminin ilişkisel olmayan dizileri de diziler olarak bıraktığını belirtmek gerekir . İstediğiniz şey bu olabilir veya olmayabilir. Kısa bir süre önce bu çözümün işlevselliğini yeniden yaratmaya ihtiyaç duyduğum halde, işlevleri kullanmadan konumdaydım json_. İşte ben geldim:

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

2

DÜNYANIN EN İYİ YOLU :)

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

farklı yöntemler kullanırsanız sorunlarınız olacaktır. Bu en iyi yöntemdir. Hiç gördün mü.


2

Bir nesneye çok boyutlu diziler. bu kod Bing arama API'sı try ve catch yönteminin dönüştürülmesi için kullanılır.

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

2

Yansıma'yı kullanabilirsiniz:

<?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);

1

CakePHP, bir diziyi temel olarak bir nesneye eşleyen özyinelemeli bir Set :: map sınıfına sahiptir. Nesnenin istediğiniz gibi görünmesini sağlamak için dizinin neye benzediğini değiştirmeniz gerekebilir.

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

En kötü durumda, bu işlevden birkaç fikir edinebilirsiniz.


1

Açıkçası sadece diğer insanların cevaplarının bir ekstrapolasyonu, ancak herhangi bir malç boyutlu diziyi bir nesneye dönüştürecek özyinelemeli fonksiyon:

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

Ve unutmayın dizi kullanarak hala elde edilen nesne başvurulabilir sayısal tuşları olsaydı {}(örneğin: $obj->prop->{4}->prop)


1

Tüm bu kodlardan esinlenerek, aşağıdakileri destekleyen gelişmiş bir sürüm oluşturmaya çalıştım: belirli sınıf adı, yapıcı yöntemi, 'fasulye' deseni ve katı moddan kaçının (sadece mevcut özellikleri ayarlayın):

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

1

kod

Bu işlev ile aynı şekilde çalışır 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;
}

Test yapmak

Test 1: Düz dizi

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

Çıktı:

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

Test 2: Nesnelerin dizisi

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

Çıktı:

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,)),
)

Test 3: Nesne

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

Çıktı:

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

0

oldukça basit bir şekilde yaptım,

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

    $object->year_id   = 1 ;
    $object->year_name = 2001 ;
    $list_years[]       = $object;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.