Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP에서 간단한 배열로 동적 연관 배열을 만드는 방법

문제 상황

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

동작 원리

  1. 빈 배열 처리: 입력 배열의 요소 개수가 0이면 중첩시킬 키가 없으므로, 성(lastName) 값을 그대로 반환합니다. 위 예제에서는 Doe가 그대로 출력됩니다.
  2. 역순 순회: array_reverse()를 사용해 ['Robert', 'Adam', 'John'] 순서로 순회합니다. 이렇게 하면 가장 깊은 수준의 구조부터 차례대로 만들 수 있습니다.
  3. 중첩 구성: 첫 번째 반복에서 [Robert => 'Smith']를 만들고, 이 배열을 새로운 값으로 사용하여 다음 반복에서 [Adam => [Robert => 'Smith']]를, 마지막에는 [John => [Adam => [Robert => 'Smith']]]라는 최종 중첩 구조가 완성됩니다.

이처럼 array_reverse()foreach 반복문만 활용하면 별도의 재귀 호출 없이도, 임의의 길이를 가진 단순 배열을 손쉽게 동적 연관 배열로 변환할 수 있습니다.