두 개의 배열을 키와 값으로 조합해서 새로운 배열을 만들려고 php array_combine()을 썼는데, 갑자기 false가 반환되거나 예상과 다른 결과가 나온 경험이 있을까. 대부분의 개발자는 이 함수가 단순히 두 배열을 합친다고만 생각하고, 정확한 동작 조건과 실패 케이스를 모른 채 디버깅에 시간을 낭비한다.
이번에는 array_combine()이 정확히 뭔지, 왜 실패하는지, 어떻게 안전하게 써야 하는지 완벽하게 정리해서 소개하겠다.
array_combine()은 첫 번째 배열의 요소를 키로, 두 번째 배열의 요소를 값으로 사용해서 새로운 연관 배열을 만드는 함수다. 메서드 서명은 다음과 같다.
array_combine(array $keys, array $values): array|false
함수는 성공하면 합쳐진 배열을, 실패하면 false를 반환한다. 여기서 중요한 건 두 배열의 요소 개수가 정확히 같아야한다는 점이다.
array_combine() 사용 시 가장 자주 마주치는 오류는 배열 길이가 다를 때 발생한다.
$keys = array('name', 'age', 'email');
$values = array('John', 30);
$result = array_combine($keys, $values);
var_dump($result);
// Warning: array_combine(): Both parameters should have an equal number of elements
// 결과: bool(false)
$keys에는 3개의 요소가, $values에는 2개의 요소만 있다. 이 상황에서 array_combine()은 false를 반환하고 워닝을 띄운다. 만약 이 false를 검사하지 않고 그 다음 코드에서 배열 함수를 쓰면 타입 에러가 터진다.
$keys = array('name', 'age', 'email');
$values = array('John', 30, 'john@example.com');
$result = array_combine($keys, $values);
var_dump($result);
// 결과:
// array(3) {
// 'name' => string(4) "John"
// 'age' => int(30)
// 'email' => string(16) "john@example.com"
// }
두 배열의 요소 개수가 같으면 정상적으로 연관 배열이 만들어진다.
실무에서는 두 배열의 길이가 미리 보장되지 않는 경우가 대부분이다. 데이터베이스나 외부 API에서 받은 데이터를 조합할 때 특히 그렇다. 이런 상황에서 안전하게 처리하는 방법을 알아보자.
function safe_combine($keys, $values) {
if (!is_array($keys) || !is_array($values)) {
return false;
}
if (count($keys) !== count($values)) {
// 로깅이나 에러 처리
error_log('array_combine: 배열 길이 불일치');
return false;
}
return array_combine($keys, $values);
}
$keys = array('id', 'name', 'status');
$values = array(1, 'Alice');
$result = safe_combine($keys, $values);
if ($result === false) {
echo '배열 조합 실패';
}
이 함수는 배열 타입을 먼저 확인하고, 길이를 비교한 후 array_combine()을 호출한다. 실패하면 false를 반환해서 호출자가 명확히 에러를 감지할 수 있다.
$keys = array('color', 'size', 'price', 'stock');
$values = array('Red', 'M');
// 짧은 배열의 길이만큼 키 배열을 자르기
$keys = array_slice($keys, 0, count($values));
$result = array_combine($keys, $values);
var_dump($result);
// 결과:
// array(2) {
// 'color' => string(3) "Red"
// 'size' => string(1) "M"
// }
이 방식은 값의 개수에 맞춰 키를 자르므로, 데이터 손실 위험이 있을 때 유용하다. 단, 의도하지 않은 데이터가 버려질 수 있으므로 주의해야 한다.
$keys = array('username', 'email', 'age');
$values = array('bob');
// array_pad()로 부족한 값을 null로 채우기
$values = array_pad($values, count($keys), null);
$result = array_combine($keys, $values);
var_dump($result);
// 결과:
// array(3) {
// 'username' => string(3) "bob"
// 'email' => NULL
// 'age' => NULL
// }
array_pad()를 사용해서 부족한 값을 null로 채운다. 부분적인 데이터가 들어올 때 유용하다. 데이터베이스에 저장하기 전에 이 방식으로 필드를 보정하는 경우가 많다.
array_combine()은 빈 배열이라도 문제없이 처리하지만, 다른 상황에서는 주의가 필요하다.
$keys = array();
$values = array();
$result = array_combine($keys, $values);
var_dump($result);
// 결과: array(0) { }
두 배열이 모두 비어있으면 빈 배열이 반환된다.
// ✗ 잘못된 패턴
$keys = array(0, 1, 2);
$values = array('a', 'b', 'c');
$result = array_combine($keys, $values);
var_dump($result);
// 결과:
// array(3) {
// [0] => string(1) "a"
// [1] => string(1) "b"
// [2] => string(1) "c"
// }
정수를 키로 쓰면 숫자 인덱스 배열이 만들어진다. 이는 일반적인 array_combine()의 목적(문자열 키 생성)과 맞지 않는다.
$columnNames = array('id', 'name', 'email');
$rowData = array(1, 'Charlie', 'charlie@example.com');
$result = array_combine($columnNames, $rowData);
var_dump($result);
// 결과:
// array(3) {
// 'id' => int(1)
// 'name' => string(7) "Charlie"
// 'email' => string(20) "charlie@example.com"
// }
키는 항상 문자열이나 의미 있는 식별자여야 한다. 데이터베이스의 컬럼명을 키로 쓸 때처럼 명확한 의도가 있어야 한다.
array_combine()이 가장 빛나는 순간은 데이터베이스에서 컬럼명과 행 데이터를 분리해서 받을 때다.
// PDO로 데이터베이스에서 조회
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare('SELECT id, username, email FROM users WHERE id = ?');
$stmt->execute([1]);
// fetch(PDO::FETCH_NUM)은 숫자 인덱스 배열로 반환
$row = $stmt->fetch(PDO::FETCH_NUM);
// $row: array(3) { [0]=> 1, [1]=> "alice", [2]=> "alice@example.com" }
// 컬럼명 배열
$columns = array('id', 'username', 'email');
// array_combine()으로 연관 배열로 변환
$user = array_combine($columns, $row);
var_dump($user);
// 결과:
// array(3) {
// 'id' => int(1)
// 'username' => string(5) "alice"
// 'email' => string(17) "alice@example.com"
// }
물론 PDO::FETCH_ASSOC를 쓰면 바로 연관 배열을 얻을 수 있지만, 특정 컬럼만 선택하거나 순서를 재정렬할 때는 array_combine()이 유용하다.
| 실수 | 원인 | 해결책 |
|---|---|---|
| 배열 길이 불일치로 false 반환 | 두 배열 요소 개수 다름 | count() 확인 후 array_pad() 또는 array_slice()로 맞추기 |
| false를 배열처럼 처리 | 반환값 검사 누락 | if ($result !== false) 체크 |
| 정수 키만 생성됨 | 키 배열이 숫자만 포함 | 키에 문자열이나 명확한 식별자 사용 |
| NULL 값 처리 오류 | NULL을 빈 값과 혼동 | 명시적으로 null 체크 및 기본값 설정 |
array_combine()은 두 배열을 키-값 쌍으로 매핑하는 강력한 도구다. 다만 두 배열의 길이가 반드시 같아야 한다는 조건을 명심해야 한다. 실무에서 외부 데이터를 다룰 때는 항상 길이를 확인하고, 필요하면 array_pad()나 array_slice()로 맞춘 후 사용하자. 이런 작은 방어 로직이 모여서 예기치 않은 버그를 방지하고 안정적인 코드를 만든다. 이 글의 safe_combine() 함수를 참고해 자신의 프로젝트에 적용하면, array_combine() 관련 오류로부터 한 단계 더 안전해질 것이다.