728x90
안녕하세요.
오늘은 FilterIterator 로 if 없는 foreach loop 만들어보도록 하겠습니다.
foreach 루프를 사용하면서 특정 조건에 맞는 데이터만 처리하기 위해 루프 내부에 if 문을 쓰는 경우가 많습니다.
코드가 길어지면 이런 if 조건문 때문에 로직이 복잡해지고 가독성이 떨어지게 됩니다.
PHP의 SPL(Standard PHP Library)이 제공하는 FilterIterator로 이러한 문제를 해결할 수 있습니다.
FilterIterator는 기존 배열이나 이터레이터를 감싸서, 우리가 정의한 특정 규칙(accept 메소드)을 통과하는 요소들만 foreach에 전달하는 '필터' 역할을 합니다.
결과적으로, 반복문 안에는 순수하게 처리 로직만 남게 되어 코드가 깔끔해집니다.
if 문을 사용하는 일반적인 foreach
<?php
class User {
public function __construct(
public string $name,
public string $status
) {}
}
// 사용자 데이터 배열
$users = new ArrayObject([
new User('앨리스', 'active'),
new User('밥', 'inactive'),
new User('찰리', 'active'),
new User('데이브', 'banned'),
new User('이브', 'active'),
]);
echo "--- if 문을 사용한 방식 ---\n";
foreach ($users as $user) {
if ($user->status === 'active') {
echo $user->name . "님은 활성 사용자입니다.\n";
}
}
?>
FilterIterator로 if 문 제거하기
<?php
class User {
public function __construct(
public string $name,
public string $status
) {}
}
$users = new ArrayObject([
new User('앨리스', 'active'),
new User('밥', 'inactive'),
new User('찰리', 'active'),
new User('데이브', 'banned'),
new User('이브', 'active'),
]);
// 'active' 상태인 사용자만 통과시키는 필터 이터레이터
class ActiveUserIterator extends FilterIterator {
// 이 메소드가 true를 반환하는 요소만 foreach에 전달됨
public function accept(): bool {
// 현재 요소(User 객체)를 가져옴
$user = $this->current();
return $user->status === 'active';
}
}
echo "--- FilterIterator를 사용한 방식 ---\n";
// 기존 사용자 배열을 필터 이터레이터로 감싸줌
$activeUsers = new ActiveUserIterator($users->getIterator());
// 루프 안에는 더 이상 if 문이 필요 없음!
foreach ($activeUsers as $user) {
echo $user->name . "님은 활성 사용자입니다.\n";
}
?>
실행 결과
--- if 문을 사용한 방식 ---
앨리스님은 활성 사용자입니다.
찰리님은 활성 사용자입니다.
이브님은 활성 사용자입니다.
--- FilterIterator를 사용한 방식 ---
앨리스님은 활성 사용자입니다.
찰리님은 활성 사용자입니다.
이브님은 활성 사용자입니다.
두 방식 모두 동일한 결과를 출력합니다.
다만, FilterIterator를 사용한 두 번째 코드는 반복 로직과 필터링 로직이 명확하게 분리되어 훨씬 더 구조적이고 재사용하기 좋습니다.
'PHP' 카테고리의 다른 글
| [PHP] 객체의 불변성을 보장하는 readonly 프로퍼티 (0) | 2025.10.03 |
|---|---|
| [PHP] array_walk()와 array_walk_recursive()의 차이점과 활용법 (0) | 2025.09.28 |
| [PHP] __clone() 메소드: 객체 복사 시 발생하는 문제와 해결법 (0) | 2025.09.19 |
| [PHP] 상속(extends)을 사용하기 (0) | 2025.09.15 |
| [PHP] nullsafe 연산자 (?->): null 체크 지옥에서 벗어나기 (0) | 2025.09.12 |