1. 本記事のポイント
- PHPでディレクトリ内のファイル一覧を取得する主要な方法を紹介
scandir
、glob
、DirectoryIterator
の使い分けを具体的に解説- 実務での用途や注意点も含め、誤用しやすいパターンも補足
2. PHPでディレクトリ内のファイル一覧を取得するとは?
PHPでは、指定したディレクトリ配下に存在するファイルやサブディレクトリの一覧を取得するための組み込み関数やクラスが複数用意されています。
ファイル操作は、ログ出力先の一覧取得や、画像フォルダの動的読み込み、バッチ処理での対象ファイル選定など、多くの場面で使われます。
代表的な方法には、シンプルなscandir
関数、ワイルドカードが使えるglob
関数、オブジェクト指向で扱えるDirectoryIterator
クラスがあります。
これらは一見似た目的に見えますが、柔軟性や処理効率、フィルタリングのしやすさに違いがあるため、用途に応じた選定が重要です。
3. 詳細解説
基本的な方法:scandir()
を使う
小規模なディレクトリ構成や一括取得に向いています。
$files = scandir('./sample_dir');
print_r($files);
// 出力例
Array
(
[0] => .
[1] => ..
[2] => file1.txt
[3] => file2.jpg
)
.
と ..
を含む点に注意し、除外処理が必要です。
$files = array_filter(scandir('./sample_dir'), fn($f) => !in_array($f, ['.', '..']));
ワイルドカードで取得:glob()
を使う
特定の拡張子やパターンに一致するファイルを取得したい場合に有効です。
$images = glob('./sample_dir/*.jpg');
print_r($images);
// 出力例
Array
(
[0] => ./sample_dir/file2.jpg
[1] => ./sample_dir/photo.jpg
)
glob()
はサブディレクトリの再帰取得には非対応ですが、単純なパターンマッチには高速です。
柔軟かつ拡張性が高い:DirectoryIterator
を使う
ファイル属性(サイズ、更新日時など)を含めて細かく制御したい場合に有用です。
$dir = new DirectoryIterator('./sample_dir');
foreach ($dir as $file) {
if ($file->isFile()) {
echo $file->getFilename() . "\n";
}
}
// 出力例
file1.txt
file2.jpg
条件分岐やファイルメタ情報の取得が可能なため、実務でのファイルフィルタリングやログ集計に向いています。
4. よくあるミス・誤解・落とし穴
scandir()
やglob()
では、.
や..
を含んでいたり、サブディレクトリが混在していたりするため、意図せずループ処理でエラーになることがあります。
また、glob()
ではディレクトリそのものは取得できないため、フォルダも対象に含めたい場合には不適です。
DirectoryIterator
は多機能ですが、イテレータとしての使い方に慣れていないと、無限ループや属性取得エラーを招くことがあります。
ファイル一覧取得の目的(拡張子指定・更新日チェック・再帰取得など)を明確にしたうえで、適切な方法を選ぶ必要があります。
5. まとめ
PHPでディレクトリ内のファイルを一覧取得する方法には、scandir
、glob
、DirectoryIterator
の3つが代表的です。
それぞれの違いと得意分野を理解し、対象のファイル構成や処理要件に応じて選択することが重要です。
特にループ処理時の除外漏れやファイル種別の扱いには注意が必要です。