ファイルの位置が変わったからといっていちいちサイトマップを作り直すのは面倒だし、新規ファイルを追加するのも面倒、ということで、自動で作ってみましょう。
先にコードを書きます。
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次元目のインデックスと値は以下の通りです。
インデックス | 値 |
---|---|
type | fileもしくはdirectory |
name | ディレクトリを含まないファイル名 |
basename | ディレクトリを含まないファイル名の拡張子を除いたもの |
extension | 拡張子 |
directory | ファイルがあるディレクトリ名 |
path | ディレクトリとファイル名を合わせたもの |
depth | 階層の深さ |
sub | サブディレクトリの内容 |
ファイル名がこちらにも含まれているのは1次元目のインデックスは後でforeach()
に投げ込むときに楽をするためです。
ディレクトリのリストとファイルのリストをそれぞれソートしてからマージしていますが、これは一緒にソートするとディレクトリとファイルが混ざってしまうのを避けるためです。
サイトマップを作るにはforeach()
で1つ1つHTMLファイルを開いてpreg_match()
でタイトルを取得すれば良いわけです。
実は、違う目的のためにこれを作ったのでサイトマップの生成部分は書いていません。そのうち書くかもしれませんが、とりあえず今回はここまでです。