東京都府中市、九段下のWEB制作会社Maromaroのブログです

2021.08.30

taka

【備忘録】コピペでOK! PHPで多階層フォルダのファイルを取得する方法

MaromaroのTakaです。

今回はPHPで多階層フォルダのファイルを取得する方法についての備忘録です。

やり方

多階層のフォルダの状態ですが、
以下の状態のディレクトリがあります。

hoge/
 ├ hoge01/
 ├ hoge02/
 ├ hoge03/
 │ └ hoge04/
 │   └ hoge05/
 └ hoge06/

フォルダ内に存在するファイルを取得する場合はglobを使えば簡単に取得はできますが、
hoge01~06のような深い階層にあるファイルの場合はそう簡単にはいきません。

↓glob使用例

$files = glob("hoge/*.*");

この場合hogeフォルダのファイル一覧は取得されますが、hoge01~06の中までは取得されません。

やり方として対象フォルダを取得し、
対象フォルダをscandirで一覧の取得をし、
foreachでフォルダが存在したらその中を突き進んで再帰的に取得させる方法があります。

以下がコードになります。

$dir = '/hoge/'; //対象フォルダ
function list_files($dir){
$list = array();
$files = scandir($dir);
foreach($files as $file){
if($file == '.' || $file == '..'){
continue; //取得したファイル名には「.」「..」などが含まれるためその場合はスキップします。
} else if (is_file($dir . $file)){
$list[] = $dir . $file;//対象がファイルであればリストに追加します。
} else if( is_dir($dir . $file) ) {
//$list[] = $dir; //フォルダ自体も一覧に含めるのであればコメントアウトを外します。
$list = array_merge($list, list_files($dir . $file . DIRECTORY_SEPARATOR));//ディレクトリであればその内容を再帰的に取得します。
}
}
return $list;
}
$result = list_files($dir);

後は結果の$resultをforeachで単一化し取得すれば、多階層フォルダ内のファイルを自由に操作することが出来ます。

いかがでしたでしょうか、
PHPで上記コードの対象ディレクトリ部分を書き換えれば簡単に使用することが出来ると思います。

以上Takaでした。