문제 상황
PHP에서는 단순 배열(일차원 배열)의 요소들을 키로 사용하는 동적 연관 배열(중첩 배열)을 만들어야 하는 경우가 종종 있습니다. 예를 들어 이름 목록이 주어졌을 때, 각 이름을 키로 삼고 가장 안쪽에 성(last name)을 값으로 배치하는 중첩 구조를 만들 수 있습니다.
다음과 같은 배열이 있다고 가정해 보겠습니다.
$namesArray = ['John', 'Adam', 'Robert'];
위 배열로부터 다음과 같은 형태의 연관 배열을 얻고자 합니다.
Array ( [John] => Array ( [Adam] => Array ( [Robert] => Smith ) ) )
예제 코드
아래 함수는 입력 배열을 array_reverse()로 뒤집어 가장 안쪽 키부터 바깥쪽으로 차례대로 감싸 나가는 방식으로 동작합니다. 입력 배열이 비어 있으면 성(lastName)을 그대로 반환합니다.
<!DOCTYPE html>
<html>
<body>
<?php
function buildingDynamicAssociativeArray($nameArr, $lastName) {
// 배열이 비어 있으면 성(lastName)을 그대로 반환
if (!count($nameArr)) {
return $lastName;
}
// 배열을 역순으로 순회하며 중첩 구조 생성
foreach (array_reverse($nameArr) as $key) {
$dynamicAssociativeArr = [$key => $lastName];
$lastName = $dynamicAssociativeArr;
}
return $dynamicAssociativeArr;
}
$namesArray = ['John', 'Adam', 'Robert'];
$result = buildingDynamicAssociativeArray($namesArray, 'Smith');
print_r($result);
// 빈 배열을 전달하는 경우
$namesArray = [];
$result1 = buildingDynamicAssociativeArray($namesArray, 'Doe');
echo "";
print_r($result1);
?>
</body>
</html>출력 결과
Array ( [John] => Array ( [Adam] => Array ( [Robert] => Smith ) ) ) Doe
동작 원리
- 빈 배열 처리: 입력 배열의 요소 개수가 0이면 중첩시킬 키가 없으므로, 성(lastName) 값을 그대로 반환합니다. 위 예제에서는
Doe가 그대로 출력됩니다. - 역순 순회:
array_reverse()를 사용해 ['Robert', 'Adam', 'John'] 순서로 순회합니다. 이렇게 하면 가장 깊은 수준의 구조부터 차례대로 만들 수 있습니다. - 중첩 구성: 첫 번째 반복에서
[Robert => 'Smith']를 만들고, 이 배열을 새로운 값으로 사용하여 다음 반복에서[Adam => [Robert => 'Smith']]를, 마지막에는[John => [Adam => [Robert => 'Smith']]]라는 최종 중첩 구조가 완성됩니다.
이처럼 array_reverse()와 foreach 반복문만 활용하면 별도의 재귀 호출 없이도, 임의의 길이를 가진 단순 배열을 손쉽게 동적 연관 배열로 변환할 수 있습니다.