PHP Nesne Array dönüştürme

17 Cevap php

Nasıl böyle bir dizi itiraz dönüştürebilirsiniz?

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

)

17 Cevap

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

usage :

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

returns :

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

like usual you can loop it like:

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

Eğer bir değişken olarak standart bir sınıf örneğini olabilir:

$object = new stdClass();

ve dizi aracılığıyla döngü değerlerini yeniden atama sırasında

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

Edson Medina işaret ettiği gibi, gerçekten temiz bir çözüm yerleşik json_ fonksiyonları kullanmak için:

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

Bu da (yinelemeli) siz veya istemiyor olabilir nesneler, içine alt dizileri her dönüştürür. Ne yazık ki bu döngü yaklaşım üzerinde 2-3x performance hit vardır.

3 yolu:

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) bir nesneye döküm bir nesnenin içine $ dizi dönüştürün

$array = array(
// ...
);
$object = (object) $array;

3) El bir nesnenin içine $ dizi dönüştürmek

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

Hızlı hack:

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

Güzel, ama işler değil.

Kolay bir yol olacağını

$object = (object)$array;

Ama ne istediğiniz değil. Eğer nesneleri isterseniz bir şey elde etmek istiyorum, ama # s bu soruya eksik olduğunu. Sadece nesneleri kullanarak nedenle nesneleri kullanarak hiçbir mantıklı.

sadece nesne için bir dizi dönüştürmek için tip döküm 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;

Orada kadarıyla farkında olarak bunu yapmak için hiçbir yerleşik bir yöntem, ama basit bir döngü kadar kolay:

    $obj= new stdClass();

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

Eğer gerekiyorsa onu recursively sizin nesne oluşturmak için bu açıklayacağız edebilirsiniz.

Eğer çok boyutlu diziler ile kullanmak istiyorsanız Aslında bazı özyineleme kullanmak isterim.

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

Kolay:

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

Örnek:

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

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

Ardından, şu doğrudur:

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

Eğer nesneye erişmek için bu ve nasıl gereken yere bağlı olarak bunu yapmak için farklı yolları vardır.

Örneğin: Sadece typecasting

$array =  (object) $yourArray;

Ancak, en uyumlu tek türü (veya sadece değerini de-başvurarak bunu görmezden gelerek) belirten bir dize dayanarak standart PHP döküm uygulayan bir yardımcı yöntem (PHP henüz dahil) kullanıyor:

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

Senin durumunda kullanım örneği (Online Demo):

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

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

, Belirli bir sınıf ismi yapıcı yöntemi, 'fasulye' desen ve (yalnızca varolan özelliklerini ayarlayabilirsiniz) sıkı modu önlemek: Bütün bu kodları esinlenerek, i desteği ile geliştirilmiş bir sürümünü oluşturmak için çalıştı:

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

Ayrıca (object) yeni bir nesne oluşturmak için değişkenin sol ekleyerek bu yapamadı.

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

http://codepad.org/9YmD1KsU

CakePHP temelde bir nesnenin içine bir dizi eşleştiren bir özyinelemeli Set :: map sınıfı vardır. Sen dizi nesne istediğiniz şekilde görünmesi için neye benzediğini değiştirmeniz gerekebilir.

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

En kötü durumda, bu işlevin bir kaç fikir almak mümkün olabilir.

Açıkçası burada sadece bir başka millet 'yanıtları ekstrapolasyon, ancak bir nesne herhangi bir malç-boyutlu bir dizi çevirecektir recursive fonksiyon bulunuyor:

   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 sayısal tuşlar hala kullanılarak elde edilen nesne başvurulabilir olsaydı {} (örneğin: $obj->prop->{4}->prop)

Ben kesinlikle temiz bir yöntem gibi kullanabilirsiniz:

<?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 $attr_name => $attr_value)
        $this->{$attr_name} = $array[$attr_name];
  }

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

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

?>

Bunu göndermek eğer:

formulaire

Eğer bu olsun:

mike

Ben nesneleri beri bu yazının üstündeki cevaplar daha fazla mantık onlar için yapılmış oldum ne olarak kullanılması gerektiğini bulundu.

Ayrıca get_object_vars kullanarak hiçbir ekstra özellikler nesne oluşturulan emin olun (Eğer aile adını veya 4 tekerlekleri olan bir kişi olan bir araba istemiyorum ..)

i, oldukça basit bir şekilde yaptım

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

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

Bu sayfadaki cevaplara ek olarak, ben bu temiz bir çözüm için here benim cevap öneririz.