min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

PHP 再帰関数その3

f:id:min117:20210101184113p:plain

再帰的にフォルダを読み込みたいお正月。その3。

 

前回作ったのを改良して

min117.hatenablog.com

今いるフォルダから下の階層を(再帰的に)読むのを作る。

 

bash(treeコマンド)で見るとこんな感じのフォルダを

f:id:min117:20210101183235p:plain

PHPで読み込んで、ブラウザからアクセスできるようにする。

 

できた。ブラウザからはこうなる。

f:id:min117:20210101183137p:plain

f:id:min117:20210101184049p:plain

ソースはこれ。

$ vim my_recursive04.php

f:id:min117:20210101183458p:plain

f:id:min117:20210101183552p:plain

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');