연관배열을 사용해도 되지만 시인성때문에 객체형태로 사용하고 싶은 경우가 있습니다.
그런경우 배열을 객체로 변경하였을때 연관배열의 문자인덱스처럼 사용해야 되는 경우 사용 할 수 있는 방법입니다.
결론은 간단하게 변수 형태로 사용 합니다.
이것은 데이터베이스의 컬럼명을 그대로 배열의 인덱스로 사용하는것처럼 객체의 퍼블릭 변수의 사용에 대한 것입니다.
// 객체 형태로 변수 사용하기
$oTest = (object)[];
$oTest->left = 22;
$oTest->top = 11;
$oTest->name = 'left-top';
echo PHP_EOL . "----- 객체 출력 -----" . PHP_EOL;
print_r($oTest);
// 객체를 배열로 만들어 주기
$aTest = (array)$oTest;
echo PHP_EOL . "----- 객체를 배열로 -----" . PHP_EOL;
print_r($aTest);
// 배열을 객체 형태로 만들어 주기
$oTest2 = (object)$aTest;
echo PHP_EOL . "----- 배열을 객체로 -----" . PHP_EOL;
print_r($oTest2);
// 연관배열 형태로 객체를 사용하기
$objName = 'top';
echo PHP_EOL . "----- 연관배열처럼 객체 사용 -----" . PHP_EOL;
echo '값은: ' . $oTest2->$objName . PHP_EOL;
// 퍼블릭만 가져온다
$aFields = get_object_vars($oTest);
echo PHP_EOL . "----- 객체의 퍼블릭 변수만 출력 -----" . PHP_EOL;
echo print_r($aFields, true) . PHP_EOL;
위에 대한 결과는 아래와 같습니다.
----- 객체 출력 -----
stdClass Object
(
[left] => 22
[top] => 11
[name] => left-top
)
----- 객체를 배열로 -----
Array
(
[left] => 22
[top] => 11
[name] => left-top
)
----- 배열을 객체로 -----
stdClass Object
(
[left] => 22
[top] => 11
[name] => left-top
)
----- 연관배열처럼 객체 사용 -----
값은: 11
----- 객체의 퍼블릭 변수만 출력 -----
Array
(
[left] => 22
[top] => 11
[name] => left-top
)
$aTest = [];
$aTest['abc']['test1'] = 'chk1';
$aTest['abc']['tst2'] = 'test2';
$aTest['abc']['2022-01'] = '하이픈';
$aTest['abc']['a-00'] = '하이픈';
$aTest['abc']['a_01'] = '언더라인';
print_r($aTest);
// 2차원 부터는 배열 그대로
$oTest = (object)$aTest;
print_r($oTest);
echo '출력확인: ' . $oTest->abc['tst2'] . PHP_EOL;
// 전체를 객체로 변경 하려면 json 으로 인코딩 디코딩 하는 방식 사용
$oTemp = json_decode(json_encode($aTest));
print_r($oTemp);
echo '출력확인: '. $oTemp->abc->tst2 . PHP_EOL;
echo '출력확인: '. $oTemp->abc->a_01 . PHP_EOL;
// Error - 변수는 숫자로시작,하이픈을 사용하지 못하기 때문에
// echo '출력확인: '. $oTemp->abc->a-01 . PHP_EOL;
// echo '출력확인: '. $oTemp->abc->['2022-01'] . PHP_EOL;
// echo '출력확인: '. $oTemp->abc->2022-01 . PHP_EOL;
// echo '출력확인: '. $oTemp->abc->'2022-01' . PHP_EOL;
// echo '출력확인: '. $oTemp->abc->"2022-01" . PHP_EOL;
다차원 배열은 어떻게 처리 될까 테스트 해 보았습니다.
# 3차원 배열
$aTest['1차원']['2차원']['3차원'] = '값';
$aTTTT['aa']['bb']['cc'] = '값';
$json_data = json_encode($aTest, JSON_UNESCAPED_UNICODE);
$json_dataT = json_encode($aTTTT, JSON_UNESCAPED_UNICODE);
echo $json_data . PHP_EOL;
echo $json_dataT. PHP_EOL;
$oJson = json_decode($json_data);
$oJsonT = json_decode($json_dataT);
echo '-------------------- 객체 형태로 출력' . PHP_EOL;
print_r($oJson);
print_r($oJsonT);
echo '-------------------- 객체 형태로 출력' . PHP_EOL;
# 한글은 오류가 발생 한다
// echo $oJson->1차원->2차원->3차원 . PHP_EOL;
echo $oJsonT->aa->bb->cc . PHP_EOL;
$name = 'bb';
echo $oJsonT->aa->$name->cc . PHP_EOL;
exit;
위에서 한글때문에 오류가 나는것이 아니라 변수는 숫자로 시작 할 수 없기 때문이다.
한글도 멤버변수로 문제 없이 사용이 가능하다
{"1차원":{"2차원":{"3차원":"값"}}}
{"aa":{"bb":{"cc":"값"}}}
-------------------- 객체 형태로 출력
stdClass Object
(
[1차원] => stdClass Object
(
[2차원] => stdClass Object
(
[3차원] => 값
)
)
)
stdClass Object
(
[aa] => stdClass Object
(
[bb] => stdClass Object
(
[cc] => 값
)
)
)
-------------------- 객체 형태로 출력
값
값
결론은 확인결과 다차원배열을 객체형태로 변경 하였을 때 배열 사용하던 형태?로 그대로 사용하면 됩니다. 연관배열의 인덱스값을 변경하여 사용하던 방식을 사용하고 싶은 경우는 위에서 마지막의 예 처럼 변수 처리 하면 됩니다.