array_merge($a, $b)는 $a의 요소 다음에 $b의 요소가 오는 새 배열을 반환합니다. 숫자 키는 0부터 다시 매겨지고, 두 배열에 같은 문자열 키가 있으면 나중 배열의 값이 이깁니다. 배열은 원하는 만큼 넘길 수 있습니다.
array_merge()는 인수를 바꾸지 않습니다. 합친 배열을 반환하므로 결과를 대입하세요: $all = array_merge($all, $more);.
숫자 키는 다시 매겨진다
array_merge()는 정수 키를 이름이 아니라 위치로 취급합니다. 정수 키를 가진 모든 요소는 덧붙여지고 0부터 새 키를 받으며, 배열들이 같은 번호를 썼거나 빈틈이 있어도 마찬가지입니다. 리스트에는 원하는 동작이지만, 번호가 ID라면 놀라운 결과입니다.
정수처럼 보이는 문자열 키('101')는 정수로 저장되므로 역시 다시 매겨집니다. 'id101' 같은 키는 그대로 유지됩니다.
array_merge와 + 연산자
+ 연산자(배열 합집합)도 배열을 합치지만 규칙이 반대입니다. 왼쪽 배열에 이미 있는 키라면 왼쪽 값이 이기고 오른쪽 값은 버려집니다. 번호를 다시 매기지 않습니다. 그래서 기본값을 채울 때는 +가, 덮어쓸 때는 array_merge()가 자연스럽습니다.
array_merge($a, $b) | $a + $b | |
|---|---|---|
| 같은 문자열 키 | $b의 값 | $a의 값 |
| 정수 키 | 다시 매겨지고 모든 값 유지 | 유지되고 겹치면 $b가 버려짐 |
| 일반적인 용도 | 리스트 합치기, 설정 덮어쓰기 | 기본값 채우기, ID 유지 |
블록의 마지막 예제는 +의 고전적인 함정입니다. ['a', 'b'] + ['x', 'y', 'z']는 a, b, z가 되는데, 왼쪽에 키 0과 1이 이미 있기 때문입니다.
스프레드 문법: [...b]
스프레드 연산자는 배열 리터럴 안에서 배열을 풀어 넣습니다. array_merge()처럼 동작합니다. 정수 키는 다시 매겨지고, PHP 8.1부터는 문자열 키도 허용되며 나중 것이 이깁니다. 배열과 단일 값을 섞을 때 읽기 좋습니다.
기존 배열에 다른 배열을 그 자리에서 덧붙이려면 스프레드 연산자와 함께 쓰는 array_push()를 참고하세요.
배열의 배열 합치기
합칠 배열들이 하나의 목록 안에 있다면 그 목록을 array_merge()에 펼쳐 넣으세요. 반복문 안에서 합칠 때도 이것이 빠른 방법입니다. 조각을 모은 다음 한 번만 합치세요.
반복문 안에서 $all = array_merge($all, $batch);라고 써도 동작하지만, 매 회차마다 커지는 배열 전체를 복사하므로 항목이 수천 개가 되면 느려집니다.
array_merge_recursive와 array_replace
array_merge_recursive()는 중첩 배열도 합치지만, 일반 값을 가진 문자열 키가 겹치면 덮어쓰지 않고 두 값을 새 배열로 모읍니다. 설정에는 대개 원하는 동작이 아닙니다. 그럴 때는 보통 array_replace_recursive()가 맞는 도구입니다. 모든 단계에서 값을 덮어쓰고 키를 유지합니다.
세 JSON 줄을 위에서 아래로 읽어 보세요. array_merge()는 db 배열 전체를 바꿔서 host를 잃었고, array_merge_recursive()는 port와 debug를 요소 두 개짜리 리스트로 만들었으며, array_replace_recursive()는 의도한 설정을 만들었습니다.
흔한 실수: 합쳐도 아무것도 지워지지 않는다
array_merge()는 다른 키 아래에 있는 중복 값을 그대로 둡니다. 태그 목록 두 개를 합치면 공통 태그가 두 번씩 들어갑니다. 결과를 array_unique()에 넘긴 다음 array_values()로 번호를 다시 매기세요.
행과 중첩 배열에서 중복을 제거하는 방법은 array_unique 페이지에서 다룹니다.
자주 묻는 질문
PHP에서 array_merge와 +의 차이는 무엇인가요?
문자열 키가 겹치면 array_merge($a, $b)는 $b의 값을, $a + $b는 $a의 값을 남깁니다. 숫자 키라면 array_merge()는 모두 덧붙이고 번호를 다시 매기며, +는 숫자 키를 유지하고 $a에 이미 있는 키를 가진 $b의 요소를 버립니다.
숫자 키를 유지하면서 배열을 합치려면 어떻게 하나요?
왼쪽 배열이 이겨야 하면 $a + $b를, 오른쪽 배열이 이겨야 하면 array_replace($a, $b)를 쓰세요. array_merge()는 항상 숫자 키를 0부터 다시 매깁니다.
PHP에서 배열의 배열을 합치려면 어떻게 하나요?
바깥 배열을 array_merge()에 펼쳐 넣으세요: $all = array_merge(...$lists);. 빈 목록이면 []를 반환합니다. 반복문에서 배열을 먼저 모으고 마지막에 한 번만 합치세요. 반복문 안에서 array_merge()를 호출하면 커지는 결과를 매번 복사합니다.
PHP에서 문자열 키와 함께 스프레드 연산자를 쓸 수 있나요?
네, PHP 8.1부터 가능합니다. 이때 [...$a, ...$b]는 array_merge($a, $b)처럼 동작합니다. 숫자 키는 번호가 다시 매겨지고 나중 문자열 키가 앞의 것을 덮어씁니다.