PHP 개발 중 특정 디렉토리 안에 어떤 하위 디렉토리들이 있는지 확인해야 하는 경우가 자주 있습니다. 이럴 때 glob() 함수와 is_dir() 함수를 조합하거나, GLOB_ONLYDIR 플래그를 활용하면 아주 간단하게 해결할 수 있습니다.
방법 1: glob()과 is_dir()로 디렉토리만 필터링하기
먼저 glob() 함수로 대상 경로의 모든 항목(파일 및 디렉토리)을 가져온 뒤, array_filter()와 is_dir() 콜백을 사용해 디렉토리 항목만 남기는 방식입니다.
예제 코드
<?php
$all_sub_dirs = array_filter(glob('*.*'), 'is_dir');
print_r($all_sub_dirs);
?>
실행 결과
glob('*.*')가 현재 디렉토리의 파일과 폴더를 모두 반환하고, is_dir() 필터를 통해 디렉토리만 걸러집니다.
Array (
[0] => demo.csv
[1] => mark.php
[2] => contact.txt
[3] => source.txt
)
방법 2: GLOB_ONLYDIR 플래그로 디렉토리만 추출하기
파일은 제외하고 오직 디렉토리 목록만 필요하다면, glob() 함수의 두 번째 인자에 GLOB_ONLYDIR 플래그를 지정하는 것이 더 깔끔하고 효율적인 방법입니다.
예제 코드
<?php
$all_dirs = glob($somePath . '/*', GLOB_ONLYDIR);
print_r($all_dirs);
?>
실행 결과
GLOB_ONLYDIR 옵션 덕분에 해당 경로 아래의 디렉토리만 배열로 반환됩니다.
Array (
[0] => example
[1] => exam
[2] => log
)
참고: 하위 디렉토리까지 재귀적으로 탐색하기
위 방법들은 바로 아래 단계의 디렉토리만 조회합니다. 만약 모든 하위 디렉토리를 한 번에 탐색하고 싶다면 재귀적 반복자인 RecursiveDirectoryIterator나 SPL을 활용하는 것이 좋습니다.
<?php
$iterator = new RecursiveDirectoryIterator($somePath, FilesystemIterator::SKIP_DOTS);
$dirs = [];
foreach ($iterator as $item) {
if ($item->isDir()) {
$dirs[] = $item->getPathname();
}
}
print_r($dirs);
?>
이처럼 상황에 맞는 함수를 선택하면 디렉토리 탐색 작업을 훨씬 수월하게 처리할 수 있습니다. 단순한 목록 조회에는 glob(), 전체 트리 탐색에는 RecursiveDirectoryIterator를 활용해 보세요.