본문 바로가기
PHP

[PHP] array_merge와 + 연산자로 두 배열 합치기의 차이점

by teamnova 2025. 11. 9.
728x90

안녕하세요, 

오늘은 array_merge와 + 연산자로 두 배열 합칠때의 차이점을 알아보도록 하겠습니다. 

 

 

PHP에서 두 배열을 합쳐야 할 때, array_merge() 함수와 + (배열 합집합 연산자) 를 사용할 수 있습니다. 

 

그러나 이 둘은 키(Key)를 다루는 방식에서 차이가 있습니다.

특히 숫자 키(Numeric Key)를 만났을 때 완전히 다르게 동작하니 주의해야 합니다.

 

  • array_merge():
    • 배열을 뒤에 덧붙이고, 겹치는 문자열 키는 덮어씁니다.
    • 숫자 키는 전부 무시하고 새로 색인(re-index)합니다.
  • + (합집합):
    • 먼저 나온 키를 무조건 유지합니다.
    • 겹치는 키(숫자든 문자열이든)는 나중에 나온 값을 그냥 무시합니다.

예제 1 - 숫자 키(Numeric Key) 처리 방식 차이

 

두 배열 모두 [0, 1, 2, ...] 형태의 숫자 키를 가질 때, 두 함수의 동작은 정반대입니다.

<?php

$arr1 = ['a', 'b', 'c']; // [0 => 'a', 1 => 'b', 2 => 'c']
$arr2 = ['d', 'e', 'f']; // [0 => 'd', 1 => 'e', 2 => 'f']

// 1. array_merge() 사용: 키를 새로 만듭니다.
$merged = array_merge($arr1, $arr2);
echo "--- array_merge() 결과 (키가 새로 생성됨) ---\n";
print_r($merged);

// 2. + 연산자 사용: 겹치는 키를 무시합니다.
$unioned = $arr1 + $arr2;
echo "\n--- + 연산자 결과 (겹치는 키 0, 1, 2가 무시됨) ---\n";
print_r($unioned);

?>

 

 

결과 

--- array_merge() 결과 (키가 새로 생성됨) ---
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d  
    [4] => e 
    [5] => f 
)

--- + 연산자 결과 (겹치는 키 0, 1, 2가 무시됨) ---
Array
(
    [0] => a  
    [1] => b  
    [2] => c  
)

 

 

예제 2 - 문자열 키(String Key) 처리: 덮어쓰기 vs 유지하기

 

문자열 키의 경우, 겹치는 키를 만났을 때의 동작이 또 다릅니다.

<?php
// 기본 설정값 (Defaults)
$defaults = [
    'host' => 'localhost',
    'user' => 'guest',
    'db'   => 'main'
];

// 사용자가 입력한 설정값 (userinfo)
$userinfo = [
    'user' => 'admin',  // 'user'가 겹침
    'port' => 3306
];

// 1. array_merge(): 사용자 설정(userinfo)으로 덮어쓰기
$merged = array_merge($defaults, $userinfo);
echo "--- array_merge() 결과 (나중 값 'admin'이 덮어씀) ---\n";
print_r($merged);

// 2. + 연산자: 기본값($defaults)을 유지
$unioned = $defaults + $userinfo;
echo "\n--- + 연산자 결과 (먼저 나온 'guest'가 유지됨) ---\n";
print_r($unioned);

?>

 

결과 

--- array_merge() 결과 (나중 값 'admin'이 덮어씀) ---
Array
(
    [host] => localhost
    [user] => admin
    [db] => main
    [port] => 3306
)

--- + 연산자 결과 (먼저 나온 'guest'가 유지됨) ---
Array
(
    [host] => localhost
    [user] => guest
    [db] => main
    [port] => 3306
)