PHPでファイルの一覧を得る方法。何度も書く必要があったでメモ。

OS XやLinuxであれば、findコマンドを使うやり方が簡単。

<?php
// EPUBファイルを列挙
exec("find $r_dir -type f -name \"*.epub\"", $filelist);
foreach ($filelist as $file) {
  // フルパスでファイルが得られる
}

外部コマンドなしで取得する方法:

<?php
// 全てのファイルを取得
$f = enumAllFiles(".");
print_r($f);

// EPUBファイルだけを取得(正規表現でパターンを指定)
$f = enumAllFiles(".", '/\.epub$/');
print_r($f);

// $path以下の全てのファイルを取得
function enumAllFiles($path, $re_mask = '') {
  $path = rtrim($path, '/');
  $files = scandir($path);
  $res = [];
  foreach ($files as $file) {
    if ($file == ".") continue;
    if ($file == "..") continue;
    $fullpath = $path."/".$file;
    if (is_file($fullpath)) {
      if ($re_mask != '') {
        if (!preg_match($re_mask, $file)) continue;
      }
      $res[] = $fullpath;
      continue;
    }
    if (is_dir($fullpath)) {
      $subf = enumAllFiles($fullpath, $re_mask);
      $res = array_merge($res, $subf);
    }
  }
  return $res;
}

scandir()を使ってファイル一覧を取得します。