배열 처리 작업을 하다 보면 두 개의 배열을 하나로 병합해야 하는 상황이 자주 생긴다. 예를 들어 CSV 파일에서 헤더 행과 데이터 행을 읽었을 때, 각 데이터를 헤더와 매핑해야 하거나, API 응답에서 이름 배열과 값 배열을 받았을 때 이를 연결하는 경우다. 다만 대부분의 개발자들은 반복문으로 일일이 처리하거나, 존재하지 않는 함수를 찾아 헤매는 경우가 많다. 이번에는 PHP의 array_combine() 함수로 정확히 뭘 할 수 있는지, 왜 필요한지, 어떻게 실무에 적용하는지 완벽하게 정리해서 소개하겠다.
array_combine()은 첫 번째 배열의 값을 키로, 두 번째 배열의 값을 값으로 사용해서 새로운 배열을 만드는 함수다. 문법은 아주 간단하다.
array_combine($keys, $values);
두 배열의 길이가 같아야 하고, 배열이 비어있지 않아야 한다. 이 조건 중 하나라도 위반되면 false를 반환한다.
실제 예시:
$keys = ['name', 'email', 'age'];
$values = ['John', 'john@example.com', 30];
$result = array_combine($keys, $values);
print_r($result);
// 결과:
// Array
// (
// [name] => John
// [email] => john@example.com
// [age] => 30
// )
CSV 파일을 읽을 때 첫 줄은 헤더(컬럼명)이고, 그 다음부터는 데이터다. 각 데이터 행을 헤더와 매핑해야 한다면?
$csv_file = "name,email,age\nJohn,john@example.com,30\nJane,jane@example.com,28";
$lines = explode("\n", $csv_file);
$header = explode(',', $lines[0]);
$rows = [];
for ($i = 1; $i < count($lines); $i++) {
$data = explode(',', $lines[$i]);
$rows[] = array_combine($header, $data);
}
print_r($rows);
// 결과:
// Array
// (
// [0] => Array ([name] => John [email] => john@example.com [age] => 30)
// [1] => Array ([name] => Jane [email] => jane@example.com [age] => 28)
// )
MySQL에서 두 개의 배열로 결과를 받아야 하는 경우 (예: ID와 이름을 따로 조회):
// 가정: 데이터베이스에서 사용자 ID와 이름을 각각 배열로 받음
$user_ids = [1, 2, 3, 4, 5];
$user_names = ['Alice', 'Bob', 'Charlie', 'David', 'Eve'];
// array_combine으로 ID를 키로, 이름을 값으로 매핑
$user_map = array_combine($user_ids, $user_names);
print_r($user_map);
// 결과:
// Array
// (
// [1] => Alice
// [2] => Bob
// [3] => Charlie
// [4] => David
// [5] => Eve
// )
어떤 API에서 필드명과 값을 따로 배열로 반환할 때:
// API 응답이 이런 형태라고 가정
$api_response = [
'fields' => ['product_id', 'product_name', 'price', 'stock'],
'values' => [101, 'Laptop', 999.99, 15]
];
// 이를 정규 키-값 형태로 변환
$product = array_combine($api_response['fields'], $api_response['values']);
echo $product['product_name']; // Laptop
echo $product['price']; // 999.99
$keys = ['name', 'email'];
$values = ['John', 'john@example.com', 'extra_value'];
$result = array_combine($keys, $values);
var_dump($result); // bool(false) - 함수가 false를 반환함
문제점: 두 배열의 길이가 다르면 array_combine()은 작동하지 않고 false를 반환한다. 이를 예상하지 못하고 결과를 바로 사용하면 치명적인 오류가 발생할 수 있다.
$keys = ['name', 'email', 'age'];
$values = ['John', 'john@example.com'];
if (count($keys) === count($values)) {
$result = array_combine($keys, $values);
} else {
// 길이가 다를 경우 처리
$result = [];
for ($i = 0; $i < count($keys) && $i < count($values); $i++) {
$result[$keys[$i]] = $values[$i];
}
}
print_r($result);
// 결과: Array ( [name] => John [email] => john@example.com )
$keys = [];
$values = [];
$result = array_combine($keys, $values);
var_dump($result); // bool(false) - 비어있는 배열도 false 반환
문제점: 배열이 비어있으면 false를 반환한다. 데이터가 없는 정상적인 상황에서도 오류 처리가 필요하다.
$keys = [];
$values = [];
if (!empty($keys) && !empty($values)) {
$result = array_combine($keys, $values);
} else {
$result = []; // 빈 배열 반환
}
print_r($result); // Array ( )
$keys = ['color', 'color', 'size']; // 'color'가 중복됨
$values = ['red', 'blue', 'M'];
$result = array_combine($keys, $values);
print_r($result);
// 결과: Array ( [color] => blue [size] => M )
// 첫 번째 'color' => 'red'는 두 번째 'color' => 'blue'에 덮어씌워짐
$keys = ['color', 'color', 'size'];
$values = ['red', 'blue', 'M'];
// 중복 키 감지
if (count($keys) !== count(array_unique($keys))) {
// 중복이 있는 경우, 배열 형태로 값을 그룹화
$result = [];
foreach ($keys as $index => $key) {
if (!isset($result[$key])) {
$result[$key] = [];
}
$result[$key][] = $values[$index];
}
} else {
$result = array_combine($keys, $values);
}
print_r($result);
// 결과: Array ( [color] => Array ( [0] => red [1] => blue ) [size] => Array ( [0] => M ) )
복잡한 상황을 대비하기 위해 안전한 래퍼 함수를 만드는 것을 추천한다:
function safe_array_combine($keys, $values) {
// 1. 입력값이 배열인지 확인
if (!is_array($keys) || !is_array($values)) {
return [];
}
// 2. 배열 길이 동일 확인
if (count($keys) !== count($values)) {
trigger_error("Keys and values must have the same length", E_USER_WARNING);
return [];
}
// 3. 비어있는 배열 확인
if (empty($keys) || empty($values)) {
return [];
}
// 4. 중복 키 확인
if (count($keys) !== count(array_unique($keys))) {
trigger_error("Duplicate keys detected", E_USER_WARNING);
return [];
}
// 5. 정상 처리
return array_combine($keys, $values);
}
// 사용 예제
$result = safe_array_combine(['name', 'email'], ['John', 'john@example.com']);
print_r($result);
// Array ( [name] => John [email] => john@example.com )
array_combine()은 두 배열을 효율적으로 병합하는 PHP의 필수 함수다. CSV 파일 처리, 데이터베이스 쿼리 결과 변환, API 응답 정규화 등 실무에서 매우 자주 마주친다. 다만 배열 길이 검증, 빈 배열 처리, 중복 키 감지 같은 사전 조건을 제대로 확인하지 않으면 false를 반환받거나 데이터가 손실될 수 있다.
이 글에서 제시한 안전한 패턴과 헬퍼 함수를 참고해 array_combine()을 올바르게 사용하면, 배열 병합 작업에서 예기치 않은 버그를 완벽하게 방지할 수 있을 것이다. 특히 대량의 데이터를 처리할 때는 반드시 입력값 검증을 선행하는 습관이 코드 품질을 크게 높여준다는 점을 기억하자.