作成日: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
未調査。