PHPでディレクトリツリー生成

ページ情報
制作日
2003-12-16
最終更新日
2003-12-16
参照用URI
http://www.arielworks.net/articles/2003/1216a
分野
ページ内目次

サイトマップを適当に作る

ファイルの位置が変わったからといっていちいちサイトマップを作り直すのは面倒だし、新規ファイルを追加するのも面倒、ということで、自動で作ってみましょう。

再帰処理

先にコードを書きます。

function make_dirtree( $directory, $depth = 0 ) { 

    // ディレクトリ、ファイルが格納される配列を初期化
    // 別々に分けるのは後でソートするときのため
    $temp_directory = array();
    $temp_file = array();


    if( $handle_directory = opendir( $directory ) ) {


        while( false !== ( $filename = readdir( $handle_directory ) ) ) {

            // ファイルとディレクトリのリストを制作
            // カレントと上位ディレクトリは除外
            if( $filename != '.' && $filename != '..' ) {

                // 拡張子取得
                if ( preg_match( "/^(.*)\.(.*)$/i",
                    $filename, $temp_name ) ) {
                    $basename = $temp_name[ 1 ];
                    $extension = $temp_name[ 2 ];
                } else {
                    $basename = $filename;
                    $extension = '';
                }

                // ディレクトリが存在したらディレクトリとして扱う。
                if( is_dir( $directory . '/' . $filename ) ) {

                    $temp_directory[ $filename ] = array(
                        'type' => 'directory',
                        'name' => $filename,
                        'basename' => $basename,
                        'extension' => $extension,
                        'directory' => $directory,
                        'path' => $directory . '/' . $filename,
                        'depth' => $depth,
                        'sub' =>make_dirtree( $directory .
                            '/' . $filename, $depth + 1 )
                    );

                } else {

                    $temp_file[ $filename ] = array(
                        'type' => 'file',
                        'name' => $filename,
                        'basename' => $basename,
                        'extension' => $extension,
                        'directory' => $directory,
                        'path' => $directory . '/' . $filename,
                        'depth' => $depth
                    );

                }
            }
        }
        closedir( $handle_directory );
    } else {
        exit( "エラー:ディレクトリ $directory が開けません。" );
    }

    // それぞれソートしてからくっつける。
    ksort( $temp_directory );
    ksort( $temp_file );
    $tree = array_merge($temp_directory,$temp_file);

    return $tree;
}

make_dirtree( string directory_name )を実行するとstring directory_name以下のファイルの一覧を配列として返します。配列はインデックスにファイル名が、値には配列としてファイルの情報が格納されています。サブディレクトリもファイルとして扱われ、ディレクトリの内容は再帰処理によって2次元目のインデックス"sub"に格納されます。

2次元目のインデックスと値は以下の通りです。

返り値に得られる配列の2次元目のインデックスと値
インデックス
type fileもしくはdirectory
name ディレクトリを含まないファイル名
basename ディレクトリを含まないファイル名の拡張子を除いたもの
extension 拡張子
directory ファイルがあるディレクトリ名
path ディレクトリとファイル名を合わせたもの
depth 階層の深さ
sub サブディレクトリの内容

ファイル名がこちらにも含まれているのは1次元目のインデックスは後でforeach()に投げ込むときに楽をするためです。

ディレクトリのリストとファイルのリストをそれぞれソートしてからマージしていますが、これは一緒にソートするとディレクトリとファイルが混ざってしまうのを避けるためです。

サイトマップの生成

サイトマップを作るにはforeach()で1つ1つHTMLファイルを開いてpreg_match()でタイトルを取得すれば良いわけです。

実は、違う目的のためにこれを作ったのでサイトマップの生成部分は書いていません。そのうち書くかもしれませんが、とりあえず今回はここまでです。

関連情報

連絡先、リンク、転載や複製などについては「サイト案内」をご覧ください。Powered by HIMMEL