일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 배열
- 동작안함
- 일부 문자열 포함여부
- MySQL
- 특수문자 포함여부
- 문자열 포함여부
- 서버부하
- primary_key
- getimagesize()
- 이걸 그렇게 쓸 줄은 몰랐지
- jQuery
- error
- 정규식
- includes()
- formula
- implode()
- strpos()
- ES6
- Excel
- JavaScript
- myshortcut
- php
- srtpos()
- 오류
- 노션
- 중간에추가
- SQL
- 1064
- explode()
- 지직거림
- Today
- Total
코딩짜는 일상
[PHP] 다중배열에 json_encode(), json_decode()하기 - stdClass Object 값 불러오기 본문
[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가 되었습니다!
왜 이런 일이 일어났을까요?
결론 (수정)
여기부터는 제 생각입니다.
위 글에 따르면 stdClass Object
는 객체입니다.
new stdClass()
를 쓰면 별도의 기본클래스 없이 객체를 만들 수 있죠.
그리고 JSON
도 객체입니다.
PHP
에서는 따로 자료형을 써주지 않아도 String
과 int
를 구분해줍니다.
그래서 array["키"] = 값
의 형태로 문자열 형태의 인덱스를 쓰는 연관배열을 만들 수 있죠.
자, 그런데 여기서 JAVA
를 보면... 이는 모든 변수 앞에 자료형을 꼭 써주어야 하는 언어입니다.
이런 타언어와 원활하게 데이터를 주고 받으려면 문자열과 상수를 구분해주어야 합니다.
그래서 JSON
은 String
을 ""
안에 쓰고 Int
는 그냥 두는 식으로 자료형을 구분해 주었습니다.
문제는 이러한 JSON
을 PHP
가 전달 받았을때 입니다.
별도의 표기가 없기에 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에 값을 추가하려면 어떻게 해야하나 찾아봤습니다.
일반 배열로 변환한 다음 값을 추가하고 다시 엔코딩 후 디코딩하면 됩니다.
혹시 제가 틀렸거나 오해한 부분이 있다면 댓글 꼭 부탁드립니다!
더 추가했으면 하는 내용도 있으시면 알려주세요!!