Jak przekonwertować tablicę na obiekt w PHP?

367

Jak przekonwertować taką tablicę na obiekt?

[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
    )
Parada uliczna
źródło
4
Jaki konkretnie przedmiot chcesz zdobyć? Mam na myśli: jakie powinny być atrybuty?
Pascal MARTIN,
w pętli powinno być jedno i drugie, ponieważ status to jedna tablica danych, więc oba są drukowane
streetparade
nie wiem od kiedy, ale to po prostu działa:$a = (object)['hello' => 'world'];
Nishchal Gautam

Odpowiedzi:

588

W najprostszym przypadku prawdopodobnie wystarczy „rzutować” tablicę jako obiekt:

$object = (object) $array;

Inną opcją byłoby utworzenie instancji klasy standardowej jako zmiennej i przejście przez tablicę podczas ponownego przypisywania wartości:

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

Jak zauważył Edson Medina , naprawdę czystym rozwiązaniem jest użycie wbudowanych json_funkcji:

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

To również (rekurencyjnie) konwertuje wszystkie podrzędne tablice na obiekty, których możesz chcieć lub nie. Niestety ma 2-3-krotny wzrost wydajności w stosunku do pętli.

Ostrzeżenie! (dzięki Ultra za komentarz):

json_decode w różnych środowiskach konwertuje dane UTF-8 na różne sposoby. W końcu dostaję wartości „240,00” lokalnie i „240” w produkcji - ogromna katastrofa. Ponadto jeśli konwersja się nie powiedzie, ciąg zostanie zwrócony jako NULL

jlb
źródło
41
„ponieważ zmienne nie mogą zaczynać się cyframi”, tak, mogą: $ object -> {3} = 'xyz';
chelmertz,
11
„ma 2-3-krotne trafienie wydajnościowe”, co jest niesprawiedliwym porównaniem, ponieważ druga metoda zwraca obiekty rekurencyjne, podczas gdy podejście zapętlone bez dalszych warunków (jak w odpowiedzi @streetparade) konwertuje tylko pierwszy poziom.
feeela
8
@feeela Nie sądzę, żeby to było niesprawiedliwe .. wspomniałem, że konwersja rekursywnie. Osiągnięto także 2-3
krotne zwiększenie
6
OSTRZEŻENIE! json_decode w różnych środowiskach konwertuje dane UTF-8 na różne sposoby. W końcu dostaję wartości „240,00” lokalnie i „240” w produkcji - ogromna katastrofa. Co więcej, jeśli konwersja nie powiedzie się, ciąg zostanie zwrócony jako NULL
Szymon Toda,
1
Uwaga przy korzystaniu z funkcji json_ *: odniesienia (np. Do innych tablic) przechowywane w oryginalnej tablicy zostaną w tym przypadku zduplikowane. Powiedzmy, że klucz xw tablicy zawiera odniesienie do innej tablicy. Następnie $object->xpo wykonaniu jednej linijki będzie duplikatem $array['x'], a nie odniesieniem do oryginalnej tablicy. W niektórych aplikacjach może to być nieszkodliwe, ale w przypadku dużych tablic marnuje pamięć i może popsuć wykonanie, jeśli odwołanie zostanie użyte później.
The Coprolal,
153

możesz po prostu użyć rzutowania typu, aby przekonwertować tablicę na obiekt.

// *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
źródło
107

Byłoby to łatwe

$object = (object)$array;

Ale nie tego chcesz. Jeśli chcesz przedmiotów, chcesz coś osiągnąć, ale tego brakuje w tym pytaniu. Używanie obiektów tylko z tego powodu nie ma sensu.

Johnnes
źródło
2
nie działa, zrobiłem to zanim zadałem pytanie tutaj, więc musi istnieć inny sposób
streetparade
20
Dlaczego musi podać powód, dla którego chce używać przedmiotów? Nie sądzę, żeby miało to związek z tym , jak to się robi. Może musi je json_encode lub serializować? Powodów może być wiele.
zombat
hmm .. spojrzałem na wynik przeglądarki wygląda jak ten obiekt (stdClass) # 150 (130) {[0] => array (1) {["status"] => string (130) "Nareszcie Mac i Użytkownicy Linuksa nie muszą się czuć jak obywatele drugiej kategorii w Chrome: mają oficjalną wersję beta… ”} oficjalnie jest to obiekt, ale jak iterować rzut, aby uzyskać dostęp do statusu jak $ obj-> status dowolny pomysł ?
streetparade,
zombat, kodowanie JSON nie jest powodem do używania obiektu, istnieje flaga do json_encode () do używania obiektów. z serializacją potrzebny byłby określony typ obiektu oczekiwany przez odbiornik. I ogólnie staram się pomóc w rzeczywistym problemie. dla mnie to pytanie sugeruje, że gdzieś indziej istnieje błąd architektoniczny.
johannes,
fajny, praca z tablicą laravel w celu rozwiązania problemu
Anthony Kal
105

Szybki hack:

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

Nie ładna, ale działa.

Edson Medina
źródło
2
Uwielbiam to rozwiązanie, używanie wbudowanych funkcji zamiast zdefiniowanych przez użytkownika jest zawsze szybsze, a to działa świetnie. Dzięki za wskazówkę.
aknatn
@Oddant Rozwiązuje to wyżej wymieniony problem (przekształca tablicę w obiekt). Twoje polecenie powinno zostać skierowane na główny post, a nie moje rozwiązanie.
Edson Medina
@EdsonMedina Zrobiłem, ale mój post jest zdecydowanie za niski.
vdegenne
1
@Oddant, aby być uczciwym wobec @EdsonMedina, oryginalne pytanie nie określa widoczności potrzebnych atrybutów, a ponieważ OP nie używa się $thisw komentarzach, które następują jako akcesor, to mocno sugeruje, że pragnie stdClasswystąpienia jako wyniku, a nie klasa zdefiniowana przez użytkownika, taka jak twoja odpowiedź. Zgadzam się z elegancją tego rozwiązania, ale niestety jest to dość powszechnie stosowany wzór, aby rozwiązać ten problem z zagnieżdżonymi tablicami, w których rzutowanie na obiekt nie działa. Możliwe jest również, że OP używa interfejsu wymagającego i obiektu jako danych wejściowych, a nie tablicy.
DeaconDesperado,
3
Nie zapominaj, że w ten sposób stracisz wszystkie oprócz podstawowych typów. DateTime będzie na przykład konwerterem stdObject.
Denis Pshenov
97

Oto trzy sposoby:

  1. Fałszywy prawdziwy obiekt:

    class convert
    {
        public $varible;
    
        public function __construct($array)
        {
            $this = $array;
        }
    
        public static function toObject($array)
        {
            $array = new convert($array);
            return $array;
        }
    }
  2. Konwertuj tablicę na obiekt, rzutując ją na obiekt:

    $array = array(
        // ...
    );
    $object = (object) $array;
  3. Ręcznie przekonwertuj tablicę na obiekt:

    $object = object;
    foreach ($arr as $key => $value) {
        $object->{$key} = $value;
    }
Julius F.
źródło
2
hmm dzięki, ale twoja klasa twarzy podaje następujący błąd Błąd krytyczny: Nie można ponownie przypisać $ this w /var/www/bot/inc/twitter-bot.php w linii 10
streetparade
1
i typcasint @ reference nie jest dobrym pomysłem, nawet nie zadziałałoby tutaj, to jest to, czego nieoczekiwanie T_OBJECT_CAST, oczekuję T_NEW lub T_STRING lub T_VARIABLE lub '$'
streetparade
2
$ array = & (object) $ array == fajna implementacja KISS!
mate64
16
Dlaczego ktoś miałby chcieć użyć innej metody niż 2)? Czy są jakieś wady?
Yogu
7
rzutowanie tablicy na obiekt nie działa na tablicach zagnieżdżonych
minhajul
34

Jest to prosty sposób: stworzy również obiekt dla tablic rekurencyjnych:

$object = json_decode(json_encode((object) $yourArray), FALSE);
star18bit
źródło
4
przekazanie falsedo json_decode()zwróci tablicę asocjacyjną.
Rust
3
@ user3284463 Przekazanie truedo json_decodezwróci tablicę asocjacyjną, falsejest ustawieniem domyślnym i zwróci StdClassinstancję.
Elliot Reed,
23

W zależności od tego, gdzie jest to potrzebne i jak uzyskać dostęp do obiektu, istnieją różne sposoby, aby to zrobić.

Na przykład: po prostu wybierz go

$object =  (object) $yourArray;

Jednak najbardziej kompatybilna jest metoda narzędziowa (jeszcze nie będąca częścią PHP), która implementuje standardowe rzutowanie PHP w oparciu o ciąg znaków określający typ (lub ignorując to, usuwając odwołanie z wartości):

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

Przykład użycia w twoim przypadku ( prezentacja online ):

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

echo rettype($yourArray, 'object')->status; // prints "Figure A. ..."
hakre
źródło
17

Ten działał dla mnie

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

stosowanie :

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

zwroty :

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

jak zwykle możesz zapętlić go w następujący sposób:

foreach($myobject as $obj)
{
  echo $obj->status;
}
Parada uliczna
źródło
Ale ten jest około 500% wolniejszy (przetestowany) niż rzutowanie typu: $ obj = (object) $ array;
xZero,
@xZero, ale $obj = (object) $array;nie działa dla tablic wielowymiarowych.
Jeff Puckett
15

O ile mi wiadomo, nie ma wbudowanej metody, aby to zrobić, ale jest to tak proste, jak prosta pętla:

    $obj= new stdClass();

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

Możesz to wyjaśnić, jeśli potrzebujesz go do rekurencyjnej budowy obiektu.

zombat
źródło
14

Możesz użyć funkcji (obiekt), aby przekonwertować tablicę na obiekt.

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

Wynikiem będzie obiekt zawierający tablice:

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

["status"] => string (87) "Rysunek A. Poziome paski przewijania Facebooka wyświetlane na ekranie o rozdzielczości 1024x768." }

[129] => array (1) {["status"] => string (44) "Pewnego dnia w pracy miałem trochę wolnego czasu}}}

Noha Shehab
źródło
9

W rzeczywistości, jeśli chcesz używać tego z tablicami wielowymiarowymi, powinieneś użyć pewnej rekurencji.

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
źródło
8

Zdecydowanie wybrałbym taką czystą drogę:

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

?>

jeśli prześlesz:

formulaire

dostaniesz to:

mikrofon

Przekonałem się, że bardziej logiczne jest porównanie powyższych odpowiedzi z Obiektów do celów, do których zostały stworzone (zamknięte małe słodkie obiekty).

Również za pomocą get_object_vars upewnij się, że w manipulowanym obiekcie nie są tworzone żadne dodatkowe atrybuty (nie chcesz, aby samochód miał nazwisko, ani osoba zachowująca się na 4 kołach).

Vdegenne
źródło
Dlaczego nie użyjesz $ attr_value zamiast $ array [$ attr_name]; w funkcji publicznej from_array ($ array)
Sakkeer Hussain
7

Możesz także użyć ArrayObject, na przykład:

<?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
źródło
1
Moim zdaniem powinna to być najlepsza odpowiedź. Więcej informacji herre
Julian
7

Ten, którego używam (jest członkiem klasy):

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
źródło
7

Technika mało skomplikowana, ale łatwa do rozszerzenia:

Załóżmy, że masz tablicę

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

Załóżmy, że masz klasę Person, która może mieć więcej lub mniej atrybutów z tej tablicy. na przykład

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

Jeśli nadal chcesz zmienić tablicę na obiekt osoby. Możesz użyć ArrayIterator Class.

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

Teraz masz obiekt iteratora.

Utwórz klasę rozszerzającą klasę FilterIterator; gdzie musisz zdefiniować metodę abstrakcyjną. Podążaj za przykładem

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

Powyższa impelmentacja wiąże właściwość tylko wtedy, gdy istnieje ona w klasie.

Dodaj jeszcze jedną metodę w klasie PersonIterator

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

Upewnij się, że masz mutatory zdefiniowane w swojej klasie. Teraz możesz wywołać te funkcje w miejscu, w którym chcesz utworzyć obiekt.

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

$personIterator->getObject(); // this will return your Person Object. 
Ankit Vishwakarma
źródło
6

rekursja jest twoim przyjacielem:

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
źródło
6

Wymaga to PHP7, ponieważ zdecydowałem się użyć funkcji lambda, aby zablokować „innerfunc” w głównej funkcji. Funkcja lambda jest wywoływana rekurencyjnie, stąd potrzeba: „use (& $ innerfunc)”. Możesz to zrobić w PHP5, ale nie możesz ukryć funkcji wewnętrznej.

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
źródło
5

użyj tej funkcji, którą wykonałem:

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

Stosowanie:

$myObject = buildObject('MyClassName',$myArray);
Nie boję się Arfaoui
źródło
5

jedna wkładka

$object= json_decode(json_encode($result_array, JSON_FORCE_OBJECT));
Tak to ja
źródło
1
Zauważ, że odniesienia (np. Do innych tablic) przechowywane w oryginalnej tablicy zostaną powielone przez ten jednowarstwowy. Powiedzmy, że klucz xw tablicy zawiera odniesienie do innej tablicy. Wtedy $object->xpo wykonaniu jednej linijki będzie duplikat $result_array['x'], a nie identyczna tablica.
The Coprolal,
4

Łatwy:

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

Przykład:

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

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

Następnie spełnione są następujące warunki:

$object->key->k === 'value';
$object->group === array('a', 'b', 'c')
Eduardo Cuomo
źródło
1
Myślę, że to obejście. Po co kodować tablicę do json, a następnie dekodować? To nie jest dla mnie optymalna decyzja.
Julian
1
@Julian, ponieważ działa rekurencyjnie, robi to w odpowiednio zdefiniowany i wystarczająco niezawodny („standardowy”) sposób, a także jest wystarczająco szybki, aby być dobrą alternatywą dla losowo kodowanej ręcznie małpiej magii.
Sz.
3

Możesz to również zrobić, dodając (obiekt) po lewej stronie zmiennej, aby utworzyć nowy obiekt.

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

http://codepad.org/9YmD1KsU

fedmich
źródło
1
być może warto wspomnieć, że nazywa się to „rzutowaniem” lub „rzutowaniem typu”: php.net/manual/en/…, a zachowanie tablicy (obiektu) () jest udokumentowane tutaj: php.net/manual/en/...
Pete
2

Korzystanie json_encodejest problematyczne ze względu na sposób, w jaki obsługuje dane inne niż UTF-8. Warto zauważyć, że metoda json_encode/ json_encodepozostawia również tablice niesocjacyjne jako tablice. To może być lub nie być to, czego chcesz. Ostatnio byłem w stanie odtworzyć funkcjonalność tego rozwiązania, ale bez korzystania z json_funkcji. Oto, co wymyśliłem:

/**
 * 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
źródło
2

Najlepsza metoda na świecie :)

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

jeśli użyjesz różnych metod, będziesz mieć problemy. To najlepsza metoda. Kiedykolwiek widziałeś.

Zezeron
źródło
2

Tablice wielowymiarowe w obiekt. ten kod służy do konwersji metody try-catch API API wyszukiwania 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
źródło
2

Możesz użyć Odbicia:

<?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
źródło
1

CakePHP ma rekurencyjną klasę Set :: map, która zasadniczo mapuje tablicę na obiekt. Może być konieczna zmiana wyglądu tablicy, aby obiekt wyglądał tak, jak chcesz.

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

W najgorszym przypadku możesz uzyskać kilka pomysłów z tej funkcji.

Dooltaz
źródło
1

Oczywiście tylko ekstrapolacja odpowiedzi innych ludzi, ale oto funkcja rekurencyjna, która przekształci dowolną tablicę wymiarów ściółki w obiekt:

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

I pamiętaj, że jeśli tablica miała klawiszy numerycznych wciąż mogą się odwoływać w powstałym obiekcie przy użyciu {}(na przykład: $obj->prop->{4}->prop)

Ben D.
źródło
1

Zainspirowany wszystkimi tymi kodami, próbowałem stworzyć ulepszoną wersję z obsługą: konkretnej nazwy klasy, unikania metody konstruktora, wzorca „fasoli” i trybu ścisłego (ustaw tylko istniejące właściwości):

    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
źródło
1

Kod

Ta funkcja działa tak samo jak 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;
}

Testowanie

Test 1: Płaski układ

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

Wynik:

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

Test 2: Szyk obiektów

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

Wynik:

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: Obiekt

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

Wynik:

stdClass::__set_state(array('a' => 1,))
stdClass::__set_state(array('a' => 1,))
acelot
źródło
0

zrobiłem to w dość prosty sposób,

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

    $object->year_id   = 1 ;
    $object->year_name = 2001 ;
    $list_years[]       = $object;
Mahomet
źródło