Menu

PHP array_map(): 모든 요소에 함수 적용하기

array_map($callback, $array)는 모든 요소에 콜백을 호출하고 결과로 이루어진 새 배열을 반환합니다. 화살표 함수, 키, 여러 배열을 한 번에 매핑하기, array_walk나 foreach가 더 맞는 경우를 알아봅니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

array_map($callback, $array)는 $array의 모든 요소에 $callback을 호출하고 결과로 이루어진 새 배열을 반환합니다. 콜백이 먼저, 배열이 두 번째이며, 원래 배열은 바뀌지 않습니다.

fn($p) => $p * 1.2는 화살표 함수입니다. 표현식 하나로 이루어지고 그 결과를 반환하는 함수입니다. 그 자리에는 어떤 callable이든 올 수 있습니다.

내장 함수를 콜백으로 쓰기

내장 함수의 이름을 문자열로 넘기세요. 배열 전체를 정리하는 가장 짧은 방법입니다. 모든 값을 trim하고, 문자열을 정수로 바꾸고, 대소문자를 바꿀 수 있습니다.

array_map('intval', ...)은 폼이나 explode()에서 온 문자열을 진짜 정수로 바꾸는 일반적인 방법입니다. PHP 8.1의 일급 callable 문법인 intval(...)로 쓸 수도 있으며, 에디터가 자동 완성하고 검사할 수 있습니다.

바깥 변수를 쓰는 클로저

화살표 함수는 주변 변수를 자동으로 봅니다. 전통적인 function은 변수를 가져오려면 use가 필요합니다. 둘 다 익명 함수 페이지에서 설명합니다.

키와 함께 쓰는 array_map

배열이 하나라면 array_map은 문자열 키를 포함해 키를 유지합니다. 하지만 콜백은 값만 받습니다. 키도 얻으려면 array_keys($array)를 두 번째 배열로 넘기세요. 그러면 콜백이 각 배열에서 요소 하나씩을 받아 호출됩니다.

두 번째 결과를 보세요. 배열을 둘 이상 넘기는 순간 키가 0, 1, 2로 바뀝니다. 그래서 마지막 줄에서 array_combine()으로 키를 다시 만듭니다.

여러 배열을 한 번에 매핑하기

추가 배열마다 콜백의 인수가 하나씩 늘며, 위치로 짝지어집니다. 배열의 길이가 다르면 짧은 쪽이 null로 채워집니다.

콜백으로 null을 넘기면 함수를 건너뛰고 배열들을 쌍으로 묶습니다.

array_map, array_walk, foreach 비교

array_map은 새 배열을 만듭니다. array_walk는 넘긴 배열을 참조로 바꾸고 콜백의 두 번째 인수로 키를 줍니다. foreach는 둘 다 할 수 있고, 요소를 건너뛰거나 break로 일찍 멈출 수도 있습니다.

모든 요소가 정확히 하나의 새 요소로 바뀔 때 array_map을 쓰세요. 일부 요소를 빼야 한다면 array_filter와 조합하거나 foreach를 쓰세요.

흔한 실수: 인수 순서

array_map은 콜백이 먼저, 배열이 두 번째입니다. 이웃 함수인 array_filter는 순서가 반대라서 헷갈리기 쉽습니다.

array_map($callback, $array);     // callback first
array_filter($array, $callback);  // array first

둘을 바꾸면 일반 배열은 올바른 콜백이 아니므로 PHP 8이 TypeError를 던집니다.

PHP는 다음과 함께 멈춥니다.

PHP Fatal error:  Uncaught TypeError: array_map(): Argument #1 ($callback) must be a valid callback or null, array callback must have exactly two members in /home/index.php:4

두 인수를 다시 바꾸면 블록이 실행됩니다.

자주 묻는 질문

PHP에서 array_map은 무엇을 하나요?

배열의 모든 요소에 함수를 호출하고 결과로 이루어진 새 배열을 반환합니다: array_map(fn($n) => $n * 2, [1, 2, 3])은 [2, 4, 6]을 반환합니다. 원래 배열은 바뀌지 않습니다.

array_map은 키를 유지하나요?

배열이 하나라면 그렇습니다. 문자열 키와 정수 키가 그대로 유지됩니다. 배열이 둘 이상이면 결과는 항상 새 키 0, 1, 2...를 받습니다.

array_map 콜백 안에서 키를 얻으려면 어떻게 하나요?

키를 두 번째 배열로 넘기세요: array_map(fn($k, $v) => "$k=$v", array_keys($arr), $arr). 결과는 리스트이므로 원래 키가 다시 필요하면 array_combine(array_keys($arr), ...)로 감싸세요.

array_map이 foreach보다 빠른가요?

의미 있는 차이는 없습니다. 둘 다 배열을 한 번 순회하며, 일반 foreach는 요소마다 함수 호출이 없어서 조금 더 빠른 경우가 많습니다. 새 배열을 만드는 변환 하나처럼 더 읽기 좋을 때 array_map을 고르세요.

array_map과 array_walk의 차이는 무엇인가요?

array_map은 새 배열을 반환하고 입력은 그대로 둡니다. array_walk는 true를 반환하며, 참조 매개변수로 배열을 그 자리에서 바꾸기 위한 것입니다: array_walk($arr, function (&$v, $k) { $v = trim($v); });.

Coddy 프로그래밍 언어 일러스트

Coddy로 코딩 배우기

시작하기