PHP 개발 중에는 배열의 키 중에서 특정 문자열로 시작하는 항목만 골라내야 하는 경우가 종종 있습니다. 예를 들어 test- 또는 foo-처럼 공통된 접두사를 가진 키만 필터링하고 싶다면 여러 가지 방식으로 구현할 수 있습니다. 이 글에서는 실무에서 바로 활용할 수 있는 네 가지 방법을 코드 예제와 함께 소개합니다.
방법 1. explode()를 활용한 기본 순회 방식
배열의 각 키를 특정 구분자로 분리한 뒤, 첫 번째 조각이 원하는 문자열과 일치하는지 확인하는 가장 직관적인 방법입니다.
$arr_main_array = array('test_val' => 123, 'other-value' => 456, 'test_result' => 789);
foreach($arr_main_array as $key => $value){
$exp_key = explode('-', $key);
if($exp_key[0] == 'test'){
$arr_result[] = $value;
}
}
if(isset($arr_result)){
print_r($arr_result);
}이 예제에서는 하이픈(-)을 기준으로 키를 나누고, 앞부분이 test인 경우에만 값을 결과 배열에 담습니다.
방법 2. 함수형 프로그래밍 접근 (array_filter_key)
코드를 더 깔끔하게 유지하고 싶다면 함수형 스타일을 활용할 수 있습니다. array_filter_key 형태의 콜백 함수를 만들어 배열 요소에 적용하면 됩니다.
$array = array_filter_key($array, function($key) {
return strpos($key, 'foo-') === 0;
});콜백 함수는 키가 foo-로 시작하면 true를 반환하므로, 해당 조건을 만족하는 요소만 새 배열에 남게 됩니다.
방법 3. foreach를 사용한 절차적 접근
전통적인 절차적 방식으로는 foreach 반복문 안에서 strpos()로 접두사를 검사합니다.
$val_1 = array();
foreach ($array as $key => $value) {
if (strpos($key, 'foo-') === 0) {
$val_1[$key] = $value;
}
}주의할 점은 비교 시 반드시 ===(엄격한 비교)를 사용해야 한다는 것입니다. strpos()는 문자열이 맨 앞에서 발견되면 0을 반환하기 때문에, 느슨한 비교(==)를 쓰면 의도치 않은 동작이 발생할 수 있습니다.
방법 4. ArrayIterator 객체를 활용한 절차적 접근
SPL에서 제공하는 ArrayIterator를 사용하면 객체 지향적인 인터페이스로 배열을 순회할 수 있습니다.
예제 코드
$i = new ArrayIterator($array);
$val_1 = array();
while ($i->valid()) {
if (strpos($i->key(), 'foo-') === 0) {
$val_1[$i->key()] = $i->current();
}
$i->next();
}valid()로 유효성을 검사하고, key()와 current()로 현재 키와 값을 가져온 뒤, next()로 다음 요소로 이동하는 구조입니다.
실행 결과
위 방법들을 실행하면 모두 다음과 같은 결과를 얻을 수 있습니다.
Array(test_val => 123 test_result => 789)
마무리 및 정리
네 가지 방법 모두 같은 결과를 반환하지만 상황에 따라 선택 기준이 달라집니다. 간단한 일회성 처리라면 방법 1이나 3이 충분하고, 재사용 가능한 로직을 만들고 싶다면 방법 2의 콜백 방식이 유리합니다. 대규모 데이터나 SPL 기반 코드베이스를 다룰 때는 방법 4처럼 ArrayIterator를 활용하는 것이 좋습니다. 어떤 방식을 선택하든 strpos() 사용 시 엄격한 비교 연산자(===)를 사용하는 것만 잊지 마세요.