코딩짜는 일상

[PHP] 다중배열에 json_encode(), json_decode()하기 - stdClass Object 값 불러오기 본문

IT/PHP

[PHP] 다중배열에 json_encode(), json_decode()하기 - stdClass Object 값 불러오기

Remily 2022. 4. 15. 17:10
반응형

똑같은 다중배열이지만 Array는 array[0][1]로 출력하고

stdClass Object는 array[0]->1로 출력합니다.

 

심지어 stdClass Object가 3단 배열이면,

// 배열을 아래와 같다고 가정할 때
Array
(
    [A] => stdClass Object
        (
            [a] => stdClass Object
                (
                    [aa] => value
                    ...etc

$_array = $array[A] -> a;
$_array[aa] -> value;

까지 가야 해서 조금 길어집니다.

 

어쩌다 이런 일이 생겼는지 실험을 좀 해봤습니다.

 

 

 


상수를 인덱스로 쓰는 배열의 json_encode, json_decode

 

먼저 배열을 만듭니다.

$arr = array(
  array(),
  array(),
  array()
);

$arr[0][0] = "apple";
$arr[0][1] = "america";
$arr[0][2] = 1000;
//또는 $arr[0]=["apple","america",1000];

$arr[1][0] = "samsung";
$arr[1][1] = "korea";
$arr[1][2] = 500;
//또는 $arr[1]=["samsung","korea",500];

$arr[2][0] = "TSMC";
$arr[2][1] = "taiwan";
$arr[2][2] = 250;
//또는 $arr[2]=["TSMC","taiwan",250];

 

 

이걸 출력하면

Array
(
    [0] => Array
        (
            [0] => apple
            [1] => america
            [2] => 1000
        )

    [1] => Array
        (
            [0] => samsung
            [1] => korea
            [2] => 500
        )

    [2] => Array
        (
            [0] => TSMC
            [1] => taiwan
            [2] => 250
        )
)

이렇게 되고,

 

 

이걸 json으로 encoding 하면

[["apple","america",1000],["samsung","korea",500],["TSMC","taiwan",250]]

 

 

다시 decoding 하면

Array
(
    [0] => Array
        (
            [0] => apple
            [1] => america
            [2] => 1000
        )

    [1] => Array
        (
            [0] => samsung
            [1] => korea
            [2] => 500
        )

    [2] => Array
        (
            [0] => TSMC
            [1] => taiwan
            [2] => 250
        )
)

이렇게 원본 그대로 엔코딩 되었다가 돌아오는 모습을 볼 수 있습니다.

 

하지만 여기서 변수명을 숫자(int)가 아닌 문자(string)로 하면 상황이 달라집니다.

 

 

 


문자열을 인덱스로 쓰는 배열의 json_encode, json_decode

 

$arr2 = array(
  array(),
  array(),
  array()
);

$arr2[0]['A'] = "apple";
$arr2[0]['B'] = "america";
$arr2[0]['C'] = 1000;
//또는 $arr[0]=["A"=>"apple","B"=>"america","C"=>1000];

$arr2[1]['A'] = "samsung";
$arr2[1]['B'] = "korea";
$arr2[1]['C'] = 500;
//또는 $arr[1]=["A"=>"samsung","B"=>"korea","C"=>500];

$arr2[2]['A'] = "TSMC";
$arr2[2]['B'] = "taiwan";
$arr2[2]['C'] = 250;
//또는 $arr[2]=["A"=>"TSMC","B"=>"taiwan","C"=>250];

 

 

먼저 엔코딩입니다.

[{"A":"apple","B":"america","C":1000},{"A":"samsung","B":"korea","C":500},{"A":"TSMC","B":"taiwan","C":250}]

아까랑은 형태가 다르죠?

 

변수명이 문자열로 주어지다 보니 변수명 : 변수값 의 형태로 만들어집니다.

int일 때는 [[ 변숫값, 변수값 ]] 이런 형태였으면

string일 때는 [{ 변수명:변숫값, 변수명:변수값 }] 이런 형태입니다.

 

 

이걸 디코딩하면 어떻게 될까요?

Array
(
    [0] => stdClass Object
        (
            [A] => apple
            [B] => america
            [C] => 1000
        )

    [1] => stdClass Object
        (
            [A] => samsung
            [B] => korea
            [C] => 500
        )

    [2] => stdClass Object
        (
            [A] => TSMC
            [B] => taiwan
            [C] => 250
        )
)

짜잔~ stdClass Object가 되었습니다!

 

왜 이런 일이 일어났을까요?

 

 

 


결론 (수정)

여기부터는 제 생각입니다.

 

 

PHP에서 클래스없이 객체 생성

이 튜토리얼은 PHP에서 클래스를 생성하지 않고 객체를 생성하는 방법을 소개합니다.

www.delftstack.com

위 글에 따르면 stdClass Object는 객체입니다.

new stdClass()를 쓰면 별도의 기본클래스 없이 객체를 만들 수 있죠.

그리고 JSON도 객체입니다.

 

 

PHP에서는 따로 자료형을 써주지 않아도 Stringint를 구분해줍니다.

그래서 array[""] = 의 형태로 문자열 형태의 인덱스를 쓰는 연관배열을 만들 수 있죠.

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

 

자, 그런데 여기서 JAVA를 보면... 이는 모든 변수 앞에 자료형을 꼭 써주어야 하는 언어입니다.

이런 타언어와 원활하게 데이터를 주고 받으려면 문자열과 상수를 구분해주어야 합니다.

그래서 JSONString""안에 쓰고 Int는 그냥 두는 식으로 자료형을 구분해 주었습니다.

 

 

문제는 이러한 JSONPHP가 전달 받았을때 입니다.

 

별도의 표기가 없기에 PHP는 전달받은 내용이 객체인지 연관배열인지 알 수가 없습니다.

그래서 일단은 객체 취급을 하기로 하고 stdClass Object로 만들었다는 것이 저의 생각입니다.

 

 

 


추가

 

스택오버플로우를 읽다가 stdClass Object를 배열로 바꿀 수 있다고 해서 해봤습니다.

$trans_arr2 = (array)$arr2;
print_r($trans_arr2);

//출력
Array
(
    [0] => Array
        (
            [A] => apple
            [B] => america
            [C] => 1000
        )

    [1] => Array
        (
            [A] => samsung
            [B] => korea
            [C] => 500
        )

    [2] => Array
        (
            [A] => TSMC
            [B] => taiwan
            [C] => 250
        )
)

 

 

 


추가 2

 

stdClass Object에 값을 추가하려면 어떻게 해야하나 찾아봤습니다.

 

일반 배열로 변환한 다음 값을 추가하고 다시 엔코딩 후 디코딩하면 됩니다.

 

 

WWW.PHPSCHOOL.COM

개발자 커뮤니티 1위 PHPSCHOOL.COM 입니다.

www.phpschool.com

 

 

혹시 제가 틀렸거나 오해한 부분이 있다면 댓글 꼭 부탁드립니다!

더 추가했으면 하는 내용도 있으시면 알려주세요!!

반응형