PHP array_map()으로 객체 메소드 호출하기
PHP에서 배열에 담긴 여러 객체의 메소드를 한 번에 호출해야 할 때 array_map() 함수를 활용하면 코드를 간결하게 작성할 수 있습니다. 버전에 따라 사용 방법이 다르므로 각각 살펴보겠습니다.
PHP 5.3 이상: 익명 함수(클로저) 활용
PHP 5.3부터는 익명 함수(클로저)를 지원하기 때문에 아래와 같이 콜백 함수를 인라인으로 작성할 수 있습니다.
$props = array_map(function($obj) {
return $obj->getProp();
}, $objs);위 코드는 배열 $objs에 있는 모든 객체의 getProp() 메소드를 순차적으로 호출하고, 그 반환값들로 구성된 새로운 배열을 만듭니다.
성능 관련 참고 사항
array_map()은 모든 요소마다 함수를 한 번씩 호출하기 때문에, 단순 반복 작업의 경우 일반적인 for 루프나 foreach 문보다 실행 속도가 다소 느릴 수 있습니다.
function map($obj) {
return $obj->getProperty();
}
$props = array_map('map', $objs);따라서 성능이 중요한 대규모 배열을 처리할 때는 반복문을 직접 사용하는 것이 더 효율적일 수 있습니다.
PHP 5.3 미만 버전에서의 방법
PHP 5.3 미만에서는 익명 함수를 사용할 수 없으므로, 별도의 명명된 함수를 정의한 후 함수 이름을 문자열로 전달해야 합니다.
function map($obj) {
return $obj->getProperty();
}
$props = array_map('map', $objs);이렇게 하면 배열 내 모든 객체에 대해 getProperty 함수가 호출되며, 각 객체의 해당 속성 값을 결과 배열로 받아올 수 있습니다.
응용 예제: 재귀적으로 UTF-8 인코딩 처리하기
array_map()은 재귀적으로 활용할 수도 있습니다. 아래 예제는 다차원 배열의 모든 값을 UTF-8로 인코딩하는 함수입니다.
function encode_data($val){
if(is_array($val)){
return $val = array_map('encode_data', $val);
} else {
return utf8_encode($val);
}
}
$value = array_map('encode_data', $value);
print_r($value);배열인 경우 자기 자신을 다시 호출하여 중첩된 배열까지 처리하고, 그 외의 값은 utf8_encode()로 인코딩합니다. 최종적으로 모든 값이 UTF-8로 변환된 결과가 출력됩니다.
정리
array_map()은 배열의 각 요소에 동일한 작업을 적용할 때 유용한 함수입니다. PHP 5.3 이상에서는 클로저를, 하위 버전에서는 명명된 함수를 콜백으로 전달하면 되며, 필요에 따라 재귀 호출을 통해 복잡한 데이터 구조도 손쉽게 처리할 수 있습니다.