動かざることバグの如し

近づきたいよ 君の理想に

PHPでファイルの一覧を取得する方法

PHPにはDirectoryIteratorという便利な方法があるっぽい。

$path = dirname(__FILE__);
$dir = new DirectoryIterator($path);
foreach ($dir as $file) {
    $file = mb_convert_encoding($file, "UTF-8", "auto");
    echo $file . "<br>";
}

だがこれだと「.」と「..」も含まれてしまう。isDot()を使うとこの2つであるか判別できる。

foreach ($dir as $file) {
    $file = mb_convert_encoding($file, "UTF-8", "auto");
    if (!$dir->isDot()){
        echo $file . "<br>";
    }
}

isFile()、isDir()を用いるとそれぞれファイルであるかディレクトリであるかどうか判別できる

foreach ($dir as $file) {
    $file = mb_convert_encoding($file, "UTF-8", "auto");
    if($dir->isFile()) echo $file . " is File<br>";
    if($dir->isDir()) echo $file . " is Directory<br>";
}

なおDirectoryIteratorの他にもFilesystemIteratorというのもあるらしく、単純にファイル名を取得する「だけ」ならこっちのほうがコードは短い。

foreach (new FilesystemIterator($path) as $file) {
    //絶対パス取得するなら$fileのみ
    $file = mb_convert_encoding($file->getFilename(), "UTF-8", "auto");
    echo $file . "<br>";
}

再帰的に回してサブディレクトリも取得したい場合はDirectoryIteratorは使えない模様

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path,FilesystemIterator::SKIP_DOTS));
foreach ($iterator as $key => $node) {
    $file = mb_convert_encoding($node->getFilename(), "UTF-8", "auto");
    echo $file . "<br>";
}
//$mode = RecursiveIteratorIterator::LEAVES_ONLY;
//$mode = RecursiveIteratorIterator::SELF_FIRST;
//$mode = RecursiveIteratorIterator::CHILD_FIRST;
$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($path,
        //FilesystemIterator::CURRENT_AS_FILEINFO | // current()メソッドでSplFileInfoのインスタンスを返す
        //FilesystemIterator::KEY_AS_PATHNAME | // key()メソッドでパスを返す
        FilesystemIterator::SKIP_DOTS // .(カレントディレクトリ)および..(親ディレクトリ)をスキップ
    ),
    $mode
);