再帰的にフォルダを読み込みたいお正月。その3。
前回作ったのを改良して
今いるフォルダから下の階層を(再帰的に)読むのを作る。
bash(treeコマンド)で見るとこんな感じのフォルダを
PHPで読み込んで、ブラウザからアクセスできるようにする。
できた。ブラウザからはこうなる。
ソースはこれ。
49行目 scandirでオブジェクトを配列に格納
51行目 配列の要素それぞれについてforeachで処理
53行目 ここで自分自身を呼び出す(再帰)。
対象がファイルなら19行目が実行されるし
対象がフォルダなら29行目に入って、また53行目に辿り着き
また対象がフォルダなら29行目に入って 〃
最深部フォルダで全てがファイルなら19行目に当たって抜けてくる。
こりゃ便利。かなり実用に近づいた。
コピペ用
<?php
// nikkei XTECK
// 54. 再帰関数を使ってみよう
// https://xtech.nikkei.com/it/article/COLUMN/20070827/280408/
// 引数$path にはディレクトリorファイルの絶対パスを指定する。
// $saiki = 0;
$kaisou = 0;
function getDirList($path) {
// global $saiki;
global $kaisou;
// $total_size = 0;
print '<br>';
//指定したのがファイルだった場合はサイズを返して終了
if (is_file($path)) {
// print '再帰:' . $saiki . '回目';
// print '<br>';
print '<font color="blue">ファイル</font>パス:<br>' . "$path";
print '<br>';
print '階層:' . $kaisou;
print '<br>';
return filesize($path);
} elseif (is_dir($path)) {
// カレントディレクトリ(.)or
// 上位階層ディレクトリ(..)の場合はここで終了
$basename = basename($path);
if ($basename == '.' || $basename == '..') {
return 0;
}
// ファイルでもなく、カレント(.)でもなく、親(..)でもない
// つまりディレクトリだったら、フォルダpathとして表示
print '<font color="red">フォルダ</font>パス:<br>' . "$path";
print '<br>';
// 階層を表示
$kaisou++;
print '階層:' . $kaisou;
print '<br>';
// ディレクトリ内にあるオブジェクト(ファイルまたはディレクトリ)の一覧を入手。
$obj_list = scandir($path);
foreach ($obj_list as $obj) {
// ディレクトリ内のオブジェクトを引数にして、自分自身を呼び出す再帰
getDirList($path . '/' . $obj);
// $total_size += getDirList($path . '/' . $obj);
// $objがディレクトリだったら
// また自分自身を呼び出す(再帰)して…を繰り返して
// 最深部の階層(ファイルのみが存在する階層)まで行く
}
// return $total_size;
// print '階層ぅ:' . "$kaisou" . '<br>';
} else {
return 0;
}
// カレントフォルダの確認
print '------------------------<br>';
print getcwd() . '<br>';
print '階層:' . $kaisou;
print '<br>';
print '------------------------<br>';
//関数実行
print getDirList('/media/WD30EZRX/PT3/test_pdf2jpg');