배열을 다루다 보면 두 개 이상의 배열을 합쳐야 하는 상황이 자주 나온다. 그럴 때 array_merge()를 쓸지, array_combine()을 쓸지 헷갈려하는 개발자들이 많다. 대충 둘 다 배열을 합치는 함수라고 생각하고 그냥 문서를 보지 않고 쓰는 경우도 많은데, 사실 둘은 동작 방식이 완전히 다르고 상황에 따라 쓰는 함수가 달라진다. 이번에는 두 함수의 정확한 차이, 언제 어떤 함수를 써야 하는지, 그리고 실무에서 자주 나오는 함정까지 완벽하게 정리해서 소개하겠다.

 

1단계. 기초부터 이해하기

array_merge()는 여러 배열의 모든 요소를 순서대로 합쳐서 새로운 배열을 만든다. 숫자 키는 자동으로 재인덱싱되고, 문자 키는 그대로 유지된다.

array_combine()은 완전히 다르다. 첫 번째 배열을 키로, 두 번째 배열을 값으로 해서 키-값 쌍을 만든다. 두 배열의 요소 개수가 반드시 같아야 한다.

 

array_merge() 동작 방식

array_merge()는 단순하다. 배열을 차례대로 붙이기만 한다.

$arr1 = [1, 2, 3];
$arr2 = [4, 5, 6];
$result = array_merge($arr1, $arr2);
var_dump($result);
// Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 )

숫자 키는 0부터 다시 시작한다. 원래 배열의 키 순서는 상관없다.

$arr1 = [10 => 'a', 20 => 'b'];
$arr2 = [30 => 'c', 40 => 'd'];
$result = array_merge($arr1, $arr2);
var_dump($result);
// Array ( [0] => a [1] => b [2] => c [3] => d )

문자 키는 유지된다.

$arr1 = ['name' => 'John', 'age' => 30];
$arr2 = ['email' => 'john@example.com'];
$result = array_merge($arr1, $arr2);
var_dump($result);
// Array ( [name] => John [age] => 30 [email] => john@example.com )

 

array_combine() 동작 방식

array_combine()은 두 배열을 키-값으로 만든다.

$keys = ['name', 'age', 'email'];
$values = ['John', 30, 'john@example.com'];
$result = array_combine($keys, $values);
var_dump($result);
// Array ( [name] => John [age] => 30 [email] => john@example.com )

두 배열의 크기가 다르면 경고가 발생하고 false를 반환한다.

$keys = ['name', 'age'];
$values = ['John', 30, 'extra'];
$result = array_combine($keys, $values);
// Warning: array_combine(): Both parameters should have an equal number of elements
var_dump($result); // bool(false)

 

2단계. 실전 상황별 사용법

 

상황 1. 여러 배열을 그냥 합치고 싶을 때

array_merge()를 쓴다.

$users = ['Alice', 'Bob'];
$admins = ['Charlie'];
$moderators = ['David', 'Eve'];

$allUsers = array_merge($users, $admins, $moderators);
var_dump($allUsers);
// Array ( [0] => Alice [1] => Bob [2] => Charlie [3] => David [4] => Eve )

 

상황 2. 두 개의 분리된 배열로부터 연관 배열을 만들고 싶을 때

array_combine()을 쓴다. 예를 들어 CSV 헤더와 값 행이 따로 있을 때.

$csvHeader = ['id', 'name', 'email', 'phone'];
$csvRow = [1, 'John Doe', 'john@example.com', '010-1234-5678'];

$record = array_combine($csvHeader, $csvRow);
var_dump($record);
// Array ( [id] => 1 [name] => John Doe [email] => john@example.com [phone] => 010-1234-5678 )

실무에서는 이 방식으로 CSV 파일을 쉽게 연관 배열로 변환할 수 있다.

 

상황 3. 기존 연관 배열에 새로운 데이터를 덮어씌우고 싶을 때

array_merge()는 같은 문자 키가 있으면 뒤의 배열 값으로 덮어씌운다.

$userDefaults = ['role' => 'user', 'status' => 'inactive', 'verified' => false];
$userInput = ['role' => 'admin', 'verified' => true];

$user = array_merge($userDefaults, $userInput);
var_dump($user);
// Array ( [role] => admin [status] => inactive [verified] => 1 )

userDefaults의 기본값에서 userInput으로 지정된 것만 덮어씌웠다.

 

3단계. 흔한 실수와 해결책

 

실수 1. array_merge()로 키-값 쌍을 만들려고 시도

✗ 잘못된 코드

$keys = ['name', 'age', 'email'];
$values = ['John', 30, 'john@example.com'];
$result = array_merge($keys, $values);
var_dump($result);
// Array ( [0] => name [1] => age [2] => email [3] => John [4] => 30 [5] => john@example.com )
// 예상: [name => John, age => 30, email => john@example.com]
// 현실: 그냥 배열이 붙었을 뿐

✓ 올바른 코드

$keys = ['name', 'age', 'email'];
$values = ['John', 30, 'john@example.com'];
$result = array_combine($keys, $values);
var_dump($result);
// Array ( [name] => John [age] => 30 [email] => john@example.com )

 

실수 2. array_combine() 사용할 때 요소 개수 안 맞춤

✗ 잘못된 코드

$keys = ['id', 'name', 'email'];
$values = ['1', 'John']; // 값이 2개만 있음
$result = array_combine($keys, $values); // 경고 발생
if ($result === false) {
    echo "배열 생성 실패";
}
// 경고: array_combine(): Both parameters should have an equal number of elements

✓ 올바른 코드

$keys = ['id', 'name', 'email'];
$values = ['1', 'John', 'john@example.com']; // 3개로 맞춤
$result = array_combine($keys, $values);
var_dump($result);
// Array ( [id] => 1 [name] => John [email] => john@example.com )

만약 요소 개수가 다를 수도 있다면, 사전에 검증하자.

$keys = ['id', 'name', 'email'];
$values = ['1', 'John'];

if (count($keys) !== count($values)) {
    die('키와 값의 개수가 다릅니다');
}
$result = array_combine($keys, $values);

 

실수 3. 숫자 키 유지를 기대하고 array_merge() 사용

✗ 잘못된 코드

$arr1 = [5 => 'a', 10 => 'b'];
$arr2 = [15 => 'c'];
$result = array_merge($arr1, $arr2);
var_dump($result);
// Array ( [0] => a [1] => b [2] => c )
// 원래 키 5, 10, 15가 모두 사라짐

✓ 올바른 코드 (+ 연산자 사용)

$arr1 = [5 => 'a', 10 => 'b'];
$arr2 = [15 => 'c'];
$result = $arr1 + $arr2; // + 연산자는 키를 유지
var_dump($result);
// Array ( [5] => a [10] => b [15] => c )

배열 + 연산자는 숫자 키도 문자 키도 모두 유지한다. 단, 앞 배열에 같은 키가 있으면 뒤의 값은 무시된다.

 

4단계. 성능 비교 및 언제 뭘 써야 할까
상황 함수 이유
여러 배열을 순서대로 이어붙이기 array_merge() 이걸 위해 존재하는 함수
기본값에 사용자 입력값 덮어씌우기 array_merge() 문자 키 덮어씌우기 기능 활용
CSV 헤더와 값으로 연관 배열 만들기 array_combine() 키-값 쌍 생성이 목표
두 개의 분리된 배열을 하나의 연관 배열로 만들기 array_combine() 키-값 쌍 생성이 목표
숫자 키를 유지하면서 배열 합치기 + 연산자 array_merge()는 숫자 키를 재인덱싱하므로 부적합

 

5단계. 실무 예제

 

예제 1. API 응답 합치기
// 여러 API로부터 데이터를 받아서 하나로 합치기
$page1Users = [
    ['id' => 1, 'name' => 'Alice'],
    ['id' => 2, 'name' => 'Bob']
];
$page2Users = [
    ['id' => 3, 'name' => 'Charlie']
];

$allUsers = array_merge($page1Users, $page2Users);
var_dump($allUsers);
// 페이징되는 API 응답을 모두 합칠 때 사용

 

예제 2. 폼 입력값 처리
// 폼 기본값에 사용자 입력을 덮어씌우기
$formDefaults = [
    'title' => '',
    'description' => '',
    'published' => false,
    'category' => 'general'
];

$userInput = $_POST; // ['title' => 'My Post', 'published' => true]
$formData = array_merge($formDefaults, $userInput);
// 사용자가 입력한 필드만 덮어씌우고, 나머지는 기본값 유지

 

예제 3. 데이터베이스 쿼리 결과를 연관 배열로 변환
// CSV나 단순 배열 형태로 받은 데이터를 연관 배열로
$columns = ['user_id', 'email', 'created_at'];
$row = [123, 'user@example.com', '2024-01-15'];

$record = array_combine($columns, $row);
// 결과: ['user_id' => 123, 'email' => 'user@example.com', 'created_at' => '2024-01-15']

// 또는 여러 행을 한 번에 처리
$allRows = [
    [123, 'user1@example.com', '2024-01-15'],
    [124, 'user2@example.com', '2024-01-16']
];
$records = array_map(fn($row) => array_combine($columns, $row), $allRows);

 

마무리

array_merge()와 array_combine()은 이름은 비슷하지만 완전히 다른 목적의 함수다. array_merge()는 배열을 순서대로 붙이고 싶을 때, array_combine()은 두 배열의 요소를 키-값 쌍으로 만들고 싶을 때 쓴다. 이 차이를 정확히 이해하면 배열 처리 코드가 훨씬 명확해지고 버그도 줄어든다. 이 글의 실무 예제들을 참고해 자신의 프로젝트에 맞게 적용하면, 데이터 변환 작업에서 훨씬 더 효율적으로 작업할 수 있을 것이다.