ラボ > PHP:PATHやURL関連、ファイル関連

phpで任意のフォルダ内のファイル一覧を出力したい(scandir(), glob())

作成日:2024-05-07, 更新日:2024-05-07

第一階層のみ出力したい

方法はいくつかあるらしいけど「glob()」が手っ取り早そう

▼「./page」内のPHPファイルのみ…としたいとき

<ul>
	<?php
		$files = glob('./page/*.php'); // 「./page」内のすべてのPHPファイルを配列に取得
		foreach ($files as $file) {
			$filename = basename($file);
			echo '<li><a href="./page/' . $filename . '">' . $filename . '</a></li>';
		}
	?>
</ul>

他の方法

上記では「glob()」にしてみたけど、将来的に条件を増やしたいなら「scandir()」のほうが良い…
→結局はファイル数や、やりたいこと次第で使い分ける必要があるっぽい

  • scandir() - マルっと取得してから、必要なファイルをフィルタリングして出力
  • glob() - フィルタリングして必要なファイルのみ取得して出力
  • DirectoryIterator/RecursiveIteratorIterator

サブフォルダ内も含めたい場合

scandir()

基本、対象階層のみなので自作する必要アリ

▼例

function findAllPhpFiles($dir, $maxDepth, $currentDepth = 0) {
	if ( 0 < $maxDepth && $maxDepth < $currentDepth ) { // 階層指定があり、最大階層を超えたとき
		return [];
	}

	$files = [];
	$items = scandir($dir);
	foreach ($items as $item) {
		if ($item === '.' || $item === '..') { // カレントディレクトリと親ディレクトリ
			continue;
		}

		$path = $dir . '/' . $item;
		if (is_dir($path)) { // サブディレクトリ: 再帰処理
			$files = array_merge($files, findAllPhpFiles($path, $maxDepth, $currentDepth + 1));
		}
		elseif (pathinfo($path, PATHINFO_EXTENSION) === 'php') { // PHPファイル: リストに追加
			$files[] = $path;
		}
	}

	return $files;
}

$file_many = findAllPhpFiles('./page', 0);
foreach ($file_many as $file) {
	$filename = str_replace('./page/', '', $file);
	echo '<li><a href="' . $file . '">' . $filename . '</a></li>';
}

glob()

「scandir()」同様、全階層をマルっと取得…というのはできないっぽい
※上記をカスタマイズする必要アリ

▼例)第1階層から第3階層まで取得させる場合

$pattern = './page/{*.php, */*.php, */*/*.php}'; // 第1階層から第3階層まで取得
$file_many = glob($pattern, GLOB_BRACE); // ./page フォルダ内のすべてのPHPファイルを配列に取得
foreach ($file_many as $file) {
	$filename = str_replace('./page/', '', $file);
	echo '<li><a href="' . $file . '">' . $filename . '</a></li>';
}

DirectoryIterator/RecursiveIteratorIterator

未調査。