PHP에서 배열을 객체로 변환하는 방법은 무엇입니까?


367

이와 같은 배열을 객체로 어떻게 변환 할 수 있습니까?

[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
정확히 어떤 종류의 물건을 얻고 싶습니까? 내가 의미하는 바는 무엇인가?
Pascal MARTIN

루프에서해야 두 상태 모두 printet되도록 한 데이터 배열 때문에
streetparade

언제부터 확실하지 않지만, 이것은 단지 작동합니다 :$a = (object)['hello' => 'world'];
Nishchal Gautam

답변:


588

가장 간단한 경우에는 배열을 객체로 "캐스트"하는 것으로 충분합니다.

$object = (object) $array;

또 다른 옵션은 표준 클래스를 변수로 인스턴스화하고 값을 다시 할당하면서 배열을 반복하는 것입니다.

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

에드 슨 메디나는 지적, 정말 깨끗한 솔루션은 내장 사용하는 것입니다 json_기능 :

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

이것은 또한 (반복적으로) 모든 하위 배열을 원하는 객체로 변환합니다. 불행히도 루핑 방식에 비해 2-3 배의 성능 저하가 있습니다.

경고! (의견에 대해 Ultra에게 감사드립니다) :

다른 환경의 json_decode는 UTF-8 데이터를 다른 방식으로 변환합니다. 나는 로컬에서 '240.00'의 값을 얻고 프로덕션에서 '240'을 얻는다-대규모 재난. 변환이 실패하면 Morover는 NULL로 리턴됩니다.


41
"변수는 숫자로 시작할 수 없으므로"가능합니다 : $ object-> {3} = 'xyz';
chelmertz 2009

11
후자의 방법은 재귀 객체를 반환하고 (@streetparade의 답변에서와 같이) 루핑 접근법은 첫 번째 수준 만 변환하기 때문에 "2-3 배의 성능 적중률"이 불공평 한 비교입니다.
feeela

8
@feeela 나는 그것이 불공평하다고 생각하지 않습니다 .. 나는 그것이 재귀 적으로 변환을 수행한다고 언급했습니다. 또한 평평한 입력 배열 (재귀를 사용하지 않을 것)을 사용하여 2-3 배의 성능을 달성했습니다.
jlb

6
경고! 다른 환경의 json_decode는 UTF-8 데이터를 다른 방식으로 변환합니다. 나는 로컬에서 '240.00'의 값을 얻고 생산에서 '240'을 얻는다-대규모 재난. 변환이 실패하면 Morover는 문자열로 NULL을 반환합니다
Szymon Toda

1
json_ * 함수를 사용하는 경우 참고 :이 경우 원래 배열에 저장된 참조 (예 : 다른 배열)가 복제됩니다. x배열 의 키 에 다른 배열에 대한 참조가 있다고 가정하십시오 . 그런 다음 $object->x하나의 라이너를 실행 한 후에 $array['x']는 원래 배열에 대한 참조가 아닌 의 복제본이 됩니다. 일부 응용 프로그램에서는 무해 할 수 있지만 대규모 배열의 경우 메모리를 낭비하고 나중에 참조를 사용하면 실행이 엉망이 될 수 있습니다.
Coprolal

153

타입 캐스팅을 사용하여 배열을 객체로 변환 할 수 있습니다.

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

쉬운 방법은

$object = (object)$array;

그러나 그것은 당신이 원하는 것이 아닙니다. 물건을 원한다면 무언가를 달성하고 싶지만이 질문에는 빠져 있습니다. 객체를 사용하는 이유 때문에 객체를 사용하는 것은 의미가 없습니다.


2
작동하지 않습니다, 나는 여기에 질문을하기 전에 그렇게 했으므로 다른 방법이 있어야합니다
streetparade

20
왜 객체를 사용하고 싶은 이유를 제시해야합니까? 나는 그것이 그것이 행해지는 방법 과 관련이 있다고 생각하지 않습니다 . 아마도 json_encode하거나 직렬화해야합니까? 이렇게하는 데에는 수십 가지 이유가있을 수 있습니다.
zombat

흠 .. 브라우저 출력을 보았습니다.이 객체는 다음과 같습니다. (stdClass) # 150 (130) {[0] => array (1) {[ "status"] => string (130) "마지막 Mac에서 리눅스 사용자는 크롬 랜드에서 2 등 시민이 될 필요가 없습니다. 공식 베타 버전이 있습니다… "} 공식이지만 객체를 던지는 방법은 $ obj-> status와 같은 상태에 도달 할 수 있습니다. ?
streetparade

zombat, JSON 인코딩은 객체를 사용할 이유가 없으며 객체를 사용하기 위해 json_encode ()에 플래그가 있습니다. 직렬화를 사용하면 수신자가 예상하는 특정 객체 유형이 필요합니다. 그리고 일반적으로 실제 문제를 해결 하려고 노력합니다 . 나를 위해이 질문은 다른 곳에 건축상의 실수가 있음을 의미합니다.
johannes

좋은 점은 라 라벨 배열을 사용하여 문제를 반대하는 것입니다
Anthony Kal

105

빠른 해킹 :

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

예쁘지 않지만 작동합니다.


2
실제로이 솔루션을 좋아합니다. 사용자 정의 대신 내장 함수를 사용하는 것이 항상 빠르며이 솔루션은 훌륭합니다. 팁 고마워.
aknatn

@Oddant 위에서 언급 한 문제를 해결합니다 (배열을 객체로 변환). 당신의 rant는 나의 해결책이 아닌 메인 포스트로 보내 져야한다.
Edson Medina

@ EdsonMedina 내가 한, 내 게시물이 너무 아래로입니다.
vdegenne

1
@Oddant, @EdsonMedina에 공평하게하기 위해, 원래의 질문은 속성에 필요한 가시성을 명시하지 않으며 $this, 접근자가 접근하는 주석에 OP를 사용하지 않기 때문에 stdClass인스턴스를 출력으로 원하고 암시 하지 않습니다. 답변과 같은 사용자 정의 클래스. 나는이 솔루션의 우아함에 동의하지만 불행히도 객체로 캐스팅 할 수없는 중첩 배열 로이 문제를 해결하기 위해 일반적으로 사용되는 패턴입니다. OP가 배열이 아닌 입력으로 객체를 요구하는 인터페이스를 사용하고있을 수도 있습니다.
DeaconDesperado 2014 년

3
이 방법을 사용하면 기본 유형을 제외한 모든 유형을 잃게된다는 것을 잊지 마십시오. DateTime은 예를 들어 변환기 stdObject입니다.
Denis Pshenov

97

세 가지 방법이 있습니다.

  1. 실제 물체를 위조하십시오 :

    class convert
    {
        public $varible;
    
        public function __construct($array)
        {
            $this = $array;
        }
    
        public static function toObject($array)
        {
            $array = new convert($array);
            return $array;
        }
    }
  2. 배열을 오브젝트로 캐스트하여 오브젝트로 변환하십시오.

    $array = array(
        // ...
    );
    $object = (object) $array;
  3. 배열을 객체로 수동으로 변환하십시오.

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

2
흠 감사하지만 당신의 얼굴 클래스는 다음과 같은 오류 치명적 오류를 제공가 : 라인 10에 /var/www/bot/inc/twitter-bot.php에서 $이을을 다시 할당 할 수 없습니다
streetparade

1
심지어 여기서 일을 wouldnt 좋은 아이디어 밤은 및 typcasint @ 참조 내가 T_NEW 또는 T_STRING 또는 T_VARIABLE 또는 '$'기대, 예기치 T_OBJECT_CAST을 가지고 무엇인가
streetparade

2
$ array = & (객체) $ array == 멋진 KISS 구현!
mate64

16
왜 2)와 다른 방법을 사용하고 싶습니까? 단점이 있습니까?
Yogu

7
배열을 객체로 형변환하는 것은 중첩 된 배열에서 작동하지 않습니다
minhajul

34

간단한 방법으로 재귀 배열에 대한 객체를 만듭니다.

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

4
전달 false하기 json_decode()연관 배열을 반환한다.
Rust

3
@ 전달 user3284463 true하는 json_decode연관 배열을 반환은 false기본이며 돌아갑니다 StdClass인스턴스를.
Elliot Reed

23

필요한 위치와 개체에 액세스하는 방법에 따라 다른 방법으로 수행 할 수 있습니다.

예를 들어 : 그냥 typecast

$object =  (object) $yourArray;

그러나 가장 호환 가능한 방법은 유형을 지정하는 문자열을 기반으로 표준 PHP 캐스팅을 구현하는 유틸리티 메소드 (아직 PHP의 일부는 아님)를 사용하는 것입니다 (또는 값을 역 참조하는 것만 무시 함).

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

귀하의 경우 사용 예 ( 온라인 데모 ) :

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

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

17

이것은 나를 위해 일했다

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

사용법 :

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

반환 :

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

평소와 같이 루프를 반복 할 수 있습니다.

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

그러나 이것은 유형 캐스팅보다 약 500 % 느립니다 (테스트). $ obj = (object) $ array;
xZero

@xZero이지만 $obj = (object) $array;다차원 배열에서는 작동하지 않습니다.
Jeff Puckett

15

내가 아는 한 내장 된 방법은 없지만 간단한 루프만큼 쉽습니다.

    $obj= new stdClass();

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

객체를 재귀 적으로 빌드하는 데 필요한 경우 설명 할 수 있습니다.


14

(객체) 함수를 사용하여 배열을 객체로 변환 할 수 있습니다.

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

결과는 배열을 포함하는 객체가됩니다 :

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

[ "status"] => string (87) "그림 A. Facebook의 가로 스크롤 막대는 1024x768 화면 해상도에 표시됩니다." }

[129] => array (1) {[ "status"] => string (44) "일전에 근무 시간이 좀 남았습니다"}}


9

실제로 이것을 다차원 배열과 함께 사용하려면 재귀를 사용하고 싶을 것입니다.

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

나는 분명히 다음과 같이 깨끗한 방법으로 갈 것입니다 :

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

?>

제출하는 경우 :

공식

당신은 이것을 얻을 것입니다 :

마이크

위의 답변을 Objects의 답변과 비교하여보다 논리적 인 것으로 나타났습니다 (귀여운 작은 물체를 캡슐화 한 목적).

또한 get_object_vars를 사용하면 조작 된 오브젝트에 추가 속성이 작성되지 않습니다 (패밀리 이름을 가진 차량이나 4 륜구동 차량을 원하지 않음).


왜 $ array [$ attr_name] 대신 $ attr_value를 사용하지 않습니까? 귀하의 공개 함수에서 from_array ($ array) 함수
Sakkeer Hussain

7

예를 들어 ArrayObject를 사용할 수도 있습니다.

<?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
제 생각에는 이것이 최선의 대답이되어야합니다. 추가 정보 정보 : php.net/manual/en/arrayobject.construct.php
Julian

7

내가 사용하는 것 (클래스 멤버) :

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

약간 복잡하지만 확장하기 쉬운 기술 :

배열이 있다고 가정하십시오.

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

이 배열의 속성이 다소있을 수있는 Person 클래스가 있다고 가정하십시오. 예를 들어

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

여전히 배열을 person 객체로 변경하려면 ArrayIterator Class를 사용할 수 있습니다.

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

이제 반복자 객체가 있습니다.

FilterIterator 클래스를 확장하는 클래스를 작성하십시오. 추상 메소드 accept를 정의해야합니다. 예를 따르십시오

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

위의 구현은 클래스에 속성이있는 경우에만 속성을 바인딩합니다.

PersonIterator 클래스에 메소드를 하나 더 추가하십시오.

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

클래스에 뮤 테이터가 정의되어 있는지 확인하십시오. 이제 객체를 생성 할 위치에서이 함수를 호출 할 준비가되었습니다.

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

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

6

재귀는 당신의 친구입니다.

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

람다 함수를 사용하여 메인 함수 내에서 'innerfunc'을 잠그기로 선택했기 때문에 PHP7이 필요합니다. 람다 함수는 재귀 적으로 호출되므로 "use (& $ innerfunc)"가 필요합니다. PHP5에서 할 수는 있지만 innerfunc를 숨길 수는 없습니다.

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

내가 만든이 기능을 사용하십시오 :

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

용법:

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

5

짧막 한 농담

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

1
원래 배열에 저장된 참조 (예 : 다른 배열)는이 단일 라이너에 의해 복제됩니다. x배열 의 키 에 다른 배열에 대한 참조가 있다고 가정하십시오 . 그런 다음 $object->x하나의 라이너를 실행 $result_array['x']하면 동일한 배열이 아닌의 복제본이 됩니다.
Coprolal

4

쉬운:

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

예:

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

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

그러면 다음 사항이 적용됩니다.

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

1
나는 이것이 해결 방법이라고 생각합니다. 왜 배열을 json으로 인코딩 한 다음 디코딩합니까? 그것은 나에게 최적의 결정이 아닙니다.
Julian

1
@Julian은 재귀 적으로 작동하기 때문에 적절하게 정의되고 충분히 신뢰할 수있는 ( "표준") 방식으로 수행되며 임의의 손으로 코딩 한 원숭이 마법을 대체 할 수있을만큼 빠릅니다.
Sz.


2

json_encodeUTF-8 이외의 데이터를 처리하는 방식 때문에 사용하는 데 문제가 있습니다. 것을주의 그것의 가치 json_encode/의 json_encode방법도 배열과 같은 비 연관 배열을 떠난다. 이것은 당신이 원하는 것일 수도 아닐 수도 있습니다. 나는 최근 에이 솔루션의 기능을 다시 만들 필요가 있지만 json_기능 을 사용하지 않는 입장에 있었습니다. 내가 생각해 낸 것은 다음과 같습니다.

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

세계에서 가장 좋은 방법 :)

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

다른 방법을 사용하면 문제가 발생합니다. 이것이 가장 좋은 방법입니다. 당신은 본 적이 있습니다.


2

객체에 다차원 배열. 이 코드는 Bing search API try and catch 메소드의 변환에 사용됩니다.

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

리플렉션을 사용할 수 있습니다 :

<?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에는 기본적으로 배열을 객체에 매핑하는 재귀 적 Set :: map 클래스가 있습니다. 객체가 원하는 방식으로 보이도록 배열 모양을 변경해야 할 수도 있습니다.

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

최악의 경우이 기능에서 몇 가지 아이디어를 얻을 수 있습니다.


1

분명히 다른 사람들의 대답을 외삽 한 것입니다. 그러나 여기에는 멀치 차원 배열을 객체로 변환하는 재귀 함수가 있습니다.

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

그리고 기억 그 배열을 사용하여 그들은 여전히 결과 객체에서 참조 할 수있는 숫자 키를 한 경우 {}(예 : $obj->prop->{4}->prop)


1

이 모든 코드에서 영감을 얻어 특정 클래스 이름, 생성자 메서드 피하기, 'beans'패턴 및 엄격한 모드 (기존 속성 만 설정)를 지원하는 향상된 버전을 만들려고했습니다.

    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

암호

이 기능은와 동일하게 작동합니다 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;
}

테스팅

테스트 1 : 플랫 어레이

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

산출:

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

테스트 2 : 객체 배열

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

산출:

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

테스트 3 : 대상

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

산출:

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

0

나는 아주 간단한 방법으로 그것을 해왔다.

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

    $object->year_id   = 1 ;
    $object->year_name = 2001 ;
    $list_years[]       = $object;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.