배열의 모든 요소에 같은 작업을 적용해야 할 때, 대부분의 개발자는 foreach 루프를 쓴다. 다만 PHP의 array_map() 함수를 모르면, 불필요하게 길고 복잡한 코드를 작성하게 된다.

이번에는 array_map()이 정확히 뭔지, 왜 필요한지, 어떻게 쓰는지 완벽하게 정리해서 소개하겠다. 함수형 프로그래밍 패턴으로 코드를 간결하게 만들고, 실무에서 자주 쓰이는 패턴들도 함께 살펴보자.

 

array_map() 기초 개념 - 뭔가요?
array_map()은 배열의 각 요소에 콜백 함수를 적용해서 새로운 배열을 반환하는 함수다. 원본 배열을 수정하지 않고, 변환된 새 배열을 만든다는 게 특징이다.
array_map(callable $callback, array $array1, array $arrayN = null): array

주요 파라미터:

- $callback: 각 요소에 적용할 함수 (클로저, 함수명 문자열, 배열 형태의 메소드도 가능)
- $array1: 첫 번째 배열
- $arrayN: (선택) 두 번째 이상의 배열들

 

실전 예제 1 - 기본 값 변환
가장 간단한 예제부터 시작하자. 배열의 모든 숫자를 2배로 만들고 싶다면?
// ✗ 잘못된 방법 - 반복문으로 일일이 처리
$numbers = [1, 2, 3, 4, 5];
$doubled = [];
foreach ($numbers as $num) {
    $doubled[] = $num * 2;
}
echo implode(', ', $doubled); // 2, 4, 6, 8, 10

✗ 문제점: 코드가 길고, 임시 배열을 만들고, 반복 구조가 명확하지 않음.

// ✓ 올바른 방법 - array_map() 사용
$numbers = [1, 2, 3, 4, 5];
$doubled = array_map(function($num) {
    return $num * 2;
}, $numbers);
echo implode(', ', $doubled); // 2, 4, 6, 8, 10

✓ 장점: 코드가 간결하고, 함수형 접근으로 의도가 명확함. PHP 7.4 이상이면 화살표 함수로 더 간단히:

// PHP 7.4+ 화살표 함수 활용
$doubled = array_map(fn($num) => $num * 2, $numbers);
// 결과: [2, 4, 6, 8, 10]

 

실전 예제 2 - 객체 배열 속성 추출
실무에서 자주 나오는 패턴: 데이터베이스에서 가져온 객체 배열에서 특정 속성만 뽑아내기.
// ✗ 잘못된 방법 - foreach로 수동 처리
$users = [
    (object)['id' => 1, 'name' => '김철수', 'email' => 'kim@example.com'],
    (object)['id' => 2, 'name' => '이영희', 'email' => 'lee@example.com'],
    (object)['id' => 3, 'name' => '박민수', 'email' => 'park@example.com']
];

$names = [];
foreach ($users as $user) {
    $names[] = $user->name;
}
print_r($names);
// Array ( [0] => 김철수 [1] => 이영희 [2] => 박민수 )

✗ 문제점: 단순히 이름만 뽑으려는데 코드가 복잡해짐.

// ✓ 올바른 방법 - array_map() 활용
$names = array_map(fn($user) => $user->name, $users);
print_r($names);
// Array ( [0] => 김철수 [1] => 이영희 [2] => 박민수 )

✓ 결과: 한 줄로 의도가 명확하게 드러남.

 

실전 예제 3 - 배열 여러 개 동시 처리
array_map()은 여러 배열을 동시에 처리할 수 있다. 예를 들어 두 배열의 요소를 각각 더하기:
// 여러 배열을 동시에 처리
$array1 = [1, 2, 3];
$array2 = [10, 20, 30];

$result = array_map(function($a, $b) {
    return $a + $b;
}, $array1, $array2);

print_r($result);
// Array ( [0] => 11 [1] => 22 [2] => 33 )

화살표 함수로:

$result = array_map(fn($a, $b) => $a + $b, $array1, $array2);
// Array ( [0] => 11 [1] => 22 [2] => 33 )

 

실전 예제 4 - 문자열 변환 (대소문자, 형식)
array_map()은 기존 PHP 함수를 직접 전달할 수도 있다:
// ✗ 잘못된 방법 - 각각 변환
$fruits = ['apple', 'banana', 'cherry'];
$upper = [];
foreach ($fruits as $fruit) {
    $upper[] = strtoupper($fruit);
}
print_r($upper);
// Array ( [0] => APPLE [1] => BANANA [2] => CHERRY )

✓ 올바른 방법 - 함수 이름을 문자열로 전달:

$fruits = ['apple', 'banana', 'cherry'];
$upper = array_map('strtoupper', $fruits);
print_r($upper);
// Array ( [0] => APPLE [1] => BANANA [2] => CHERRY )

✓ 결과: 한 줄로 간단함. 추가로 trim()도 조합할 수 있다:

// 여러 함수를 조합해서 처리
$messyData = [' apple ', ' banana ', ' cherry '];
$clean = array_map(fn($item) => strtoupper(trim($item)), $messyData);
print_r($clean);
// Array ( [0] => APPLE [1] => BANANA [2] => CHERRY )

 

주의사항 - array_map vs array_filter vs array_walk
함수 용도 반환값 원본 배열 수정
array_map() 각 요소 변환 새로운 배열 반환 원본 유지
array_filter() 조건에 맞는 요소만 필터링 새로운 배열 반환 원본 유지
array_walk() 각 요소에 작업 수행 boolean (true/false) 원본 배열 직접 수정 가능

 

흔한 실수 - null 처리

✗ 잘못된 패턴 - 첫 번째 배열만 있을 때:

$data = ['1', '2', '3'];
// 콜백에 여러 파라미터가 있으면 에러 발생 가능
$result = array_map(fn($item, $extra) => $item + $extra, $data);
// Warning: Undefined variable $extra

✓ 올바른 방법 - 배열 개수에 맞게:

$data = ['1', '2', '3'];
// 한 배열만 사용할 때는 파라미터 하나
$result = array_map(fn($item) => (int)$item, $data);
print_r($result);
// Array ( [0] => 1 [1] => 2 [2] => 3 )

 

핵심 정리

array_map()은 배열의 모든 요소를 변환해야 할 때 가장 간결하고 읽기 좋은 방법이다. 함수형 프로그래밍 패턴을 활용하면 코드가 간단해지고, 의도도 명확해진다. 특히 PHP 7.4 이상의 화살표 함수 문법과 함께 쓰면, 한 줄로도 복잡한 배열 처리를 할 수 있다.

이 글의 예제들을 참고해서 foreach 반복문 대신 array_map()을 적극 활용하면, 코드 가독성이 크게 개선될 것이다.