본문 바로가기
PHP

[PHP] ... (스프레드 연산자) 배열 병합 및 함수 인자 전달

by teamnova 2025. 10. 5.
728x90

기존에는 두 배열을 합치기 위해 array_merge()를 사용했습니다.

<?php
// 기존 방식: array_merge()
$fruits1 = ['apple', 'banana'];
$fruits2 = ['orange', 'mango'];
$merged_fruits = array_merge($fruits1, $fruits2);

print_r($merged_fruits);

// 스프레드 연산자 방식
$fruits1 = ['apple', 'banana'];
$fruits2 = ['orange', 'mango'];
$merged_fruits1 = [...$fruits1, ...$fruits2];

print_r($merged_fruits1);

 

배열 중간에 다른 배열을 삽입 할 수 있습니다

$start = ['one', 'two'];
$middle = ['three', 'four'];
$end = ['five'];

$numbers = [...$start, ...$middle, 'ANOTHER_ITEM', ...$end];

print_r($numbers);

 

스프레드 연산자는 array_merge()와 거의 비슷하게 동작하지만, 문자열 키(string key)를 가진 연관 배열을 다룰 때 차이점이 있습니다.

 

array_merge(): 뒤에 오는 배열의 값이 이전 배열의 값을 덮어씁니다.
스프레드 연산자: 나중에 오는 배열의 값이 이전 배열의 값을 덮어씁니다. (동일하게 동작)

 

숫자 키를 다룰 때는 다릅니다.

 

array_merge(): 숫자 키를 가진 배열을 합칠 때, 키를 0부터 다시 인덱싱합니다.
스프레드 연산자: 숫자 키를 그대로 유지하며, 키가 중복될 경우 뒤에 오는 값으로 덮어씁니다.

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

// array_merge()는 키를 0, 1, 2, 3으로 재정렬
$merged = array_merge($arr1, $arr2);
// [ 0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd' ]

// 스프레드 연산자는 키를 보존하고 덮어씀
$spread = [...$arr1, ...$arr2];
// [ 0 => 'c', 1 => 'b', 2 => 'd' ]
// arr2[0]('c')가 arr1[0]('a')를 덮어씀

print_r($merged);
print_r($spread);

 

숫자 인덱스를 유지해야 하는 경우에는 + 연산자나 스프레드 연산자를, 키를 무시하고 순서대로 합치고 싶을 때는 array_merge()를 사용하는 것이 좋습니다.

 

함수인자에서의 사용

 

함수를 호출할 때, 배열의 각 요소를 함수의 개별 인자로 전달해야 하는 경우가 있습니다. 과거에는 call_user_func_array()라는 함수를 사용해야 했습니다.

 

// 기존 방식: call_user_func_array()
function calculateSum($a, $b, $c) {
    return $a + $b + $c;
}

$numbers = [10, 20, 30];
$sum = call_user_func_array('calculateSum', $numbers); // 60    
echo $sum . PHP_EOL;

 

// 스프레드 연산자 방식
function calculateSum($a, $b, $c) {
    return $a + $b + $c;
}

$numbers = [10, 20, 30];
$sum = calculateSum(...$numbers); // 60

echo $sum . PHP_EOL;

...$numbers가 $numbers 배열을 펼쳐서 calculateSum(10, 20, 30) 형태로 자동으로 변환해줍니다.