xxx.s500

トップ | 最近の更新 | このサイトについて | rss2.0

[php] ファイルの情報を配列に格納する

このサイトもページが増えてきたので、インデックスの更新が面倒になったり、rssが欲しくなったりしてきた。 ここのコンテンツはデータベースではなくファイルで管理しているので、それらを実現するにはそれなりの方法を用いなければならぬ。何はなくともファイルの情報を配列に格納しないことに始まらない。
んなわけでphpでこんなのを書いてみた。

$d = 'txt/'; //デレクトリ
$data = array();

if ($dir = opendir($d)) {
  while (($file = readdir($dir)) !== false) {

    if ($file == "." || $file === "..") continue;

    $df = $d.$file;
    $f = array();
    
    $f['name'] = $file; //ファイル名を格納
    $f['date'] = filemtime($df); //ファイル更新日時(unixtime)を格納

    $fp = fopen($df, 'r');
    $f['title'] = trim(strip_tags(deleteBom(fgets($fp)))); //ファイルの1行目の文字列を格納
    fclose($fp);

    $data[] = $f; 
  }
  closedir($dir);
}

//ファイルの更新日時でソート
$volume = array();
foreach($data as $key => $row) {
    $volume[$key]  = $row['date'];
}
array_multisort($volume, SORT_DESC, $data);

//文字列からUTF-8のBOMデータを削除する
function deleteBom($str)
{
    if (($str == NULL) || (mb_strlen($str) == 0)) {
        return $str;
    }
    if (ord($str{0}) == 0xef && ord($str{1}) == 0xbb && ord($str{2}) == 0xbf) {
        $str = substr($str, 3);
    }
    return $str;
}

あとは配列を廻してしかるべきタグを付与して file_put_contents で書き出せばrssとか更新順一覧ページとかを生成することができる。
インデックスページを作るときは、ページタイトル(ファイルの1行目の文字列)でソートしなおして書き出せばいい。 単純な工程なのでデータベースを使うより簡単かも。

BOMデータの削除について

ファイル先頭の文字列を取得してページのタイトルとしているのだけど、ファイルにBOMデータが含んでいた場合にはタイトル順のソートに失敗してしまう模様。 なのできちんと削除することにした。