연관 배열은 각 값을 직접 고른 키 아래에 저장하며, key => value로 씁니다: $user = ['name' => 'Ada', 'age' => 36];. 값은 $user['name']으로 읽고, 키에 대입해 추가하거나 바꿉니다: $user['email'] = 'ada@example.com';.
다른 언어에서는 같은 구조를 딕셔너리, 맵, 해시라고 부릅니다. PHP에서는 키가 0, 1, 2 대신 문자열인 평범한 배열입니다.
쌍 추가, 변경, 삭제
존재하지 않는 키에 대입하면 끝에 추가됩니다. 존재하는 키에 대입하면 값이 바뀌고 위치는 그대로입니다. unset()은 쌍을 삭제합니다.
여기서 array_push()는 도움이 되지 않습니다. 숫자 키로 값을 덧붙이는 일만 할 수 있습니다. 여러 쌍을 한 번에 추가하려면 새 값이 이기는 array_merge($stock, $more)나, 기존 키가 값을 유지하는 $stock + $more를 쓰세요. 두 방식의 비교는 array_merge 페이지에 있습니다.
키와 값 반복하기
foreach ($array as $key => $value)는 추가된 순서대로 쌍을 순회합니다. 값만 필요하면 $key =>를 생략하세요.
모든 키나 모든 값 얻기
array_keys()는 키를 평범한 리스트로, array_values()는 값을 반환하며, 둘 다 0부터 다시 번호가 매겨집니다. array_keys()에 두 번째 인수를 주면 그 값을 가진 키만 반환하며, 이렇게 한 값에 대한 모든 키를 찾습니다.
키 하나만 필요하다면 array_search()가 첫 번째 일치를 반환하고, 없으면 false를 반환합니다. 그 결과를 왜 !== false로 비교해야 하는지는 array_search 페이지에서 설명합니다.
키가 있는지 확인하기
isset($arr['key'])가 일반적이고 가장 빠른 확인이지만, 키가 있고 값이 null이면 false를 반환합니다. 그 경우에도 array_key_exists('key', $arr)는 true를 반환합니다. 기본값과 함께 읽을 때는 ?? 연산자가 둘을 한 번에 처리합니다.
키나 값으로 정렬하기
ksort()는 키로, asort()는 값으로 정렬하며, 둘 다 각 키를 값과 연결된 채로 유지합니다. krsort()와 arsort()는 역순으로 정렬합니다. 연관 배열에 sort()를 쓰지 마세요. 키를 버리고 0부터 번호를 다시 매깁니다.
이 함수들은 모두 원래 배열을 정렬하고 true를 반환하므로, $sorted = ksort($arr)는 배열이 아니라 true를 줍니다. 사용자 정의 순서에는 uasort()와 uksort()를 씁니다.
뒤집기, 세기, JSON 변환
키와 값 데이터에서 자주 쓰는 한 줄짜리 함수들입니다. array_flip()은 키와 값을 맞바꾸고, array_count_values()는 각 값이 몇 번 나오는지 세며, json_encode()는 배열을 JSON 객체로 바꿉니다.
흔한 실수: 없는 키 읽기
없는 키를 읽으면 null이 반환되지만, PHP는 경고도 출력합니다.
<?php
$user = ['name' => 'Ada'];
echo $user['phone'];
Warning: Undefined array key "phone" in /var/www/html/index.php on line 3
경고가 나지 않는 ??로 기본값을 주거나, 키가 없는 경우에 별도의 분기가 필요하다면 먼저 isset()으로 확인하세요.
큰따옴표 문자열 안에서는 조회를 중괄호로 감싸세요: "{$user['email']}". 중괄호가 없으면 PHP는 따옴표 없는 형태 "$user[email]"만 받아들이며, 이는 실수하기 쉽습니다.
자주 묻는 질문
PHP에서 연관 배열을 만들려면 어떻게 하나요?
대괄호 안에 각 쌍을 key => value로 쓰세요: $prices = ['apple' => 1.2, 'pear' => 0.9];. 값은 $prices['apple']로 읽습니다.
PHP에서 연관 배열을 키로 정렬하려면 어떻게 하나요?
A부터 Z 순서는 ksort($arr);, Z부터 A 순서는 krsort($arr);를 호출하세요. 둘 다 원래 배열을 정렬하고, 모든 값을 키와 함께 유지하며, 정렬된 배열이 아니라 true를 반환합니다.
PHP에서 연관 배열을 반복하려면 어떻게 하나요?
두 변수를 함께 쓰는 foreach를 쓰세요: foreach ($prices as $fruit => $price) { echo "$fruit: $price\n"; }. 쌍은 추가된 순서대로 나옵니다.
연관 배열의 모든 키를 얻으려면 어떻게 하나요?
array_keys($arr)는 키를 인덱스 배열로 반환하고, array_values($arr)는 값을 반환합니다. array_keys($arr, $value)는 값이 $value와 같은 키만 반환합니다.
PHP 연관 배열은 삽입 순서를 유지하나요?
네. PHP 배열은 순서 있는 맵이므로, ksort(), asort() 같은 함수로 정렬하기 전까지 foreach, print_r, json_encode 모두 쌍을 삽입한 순서대로 봅니다.