Menu

PHP 배열 합치기 array_merge(): 두 개 이상 병합

array_merge($a, $b)는 배열을 하나로 합칩니다. 숫자 키의 값은 뒤에 붙고 번호가 다시 매겨지며, 문자열 키는 나중 배열이 이깁니다. array_merge와 + 연산자, 스프레드 문법 [...$a, ...$b]의 차이, 배열 목록 합치기, array_merge_recursive나 array_replace가 더 맞는 경우를 알아봅니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

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이 이미 있기 때문입니다.

스프레드 문법: [...a,...a, ...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)처럼 동작합니다. 숫자 키는 번호가 다시 매겨지고 나중 문자열 키가 앞의 것을 덮어씁니다.

Coddy 프로그래밍 언어 일러스트

Coddy로 코딩 배우기

시작하기