昨日、HPに記事を投稿した時、
記事一覧の自動生成を行うPHP(2013/04/12作成)にバグがあることを発見しました。
日付(記事ファイル名)を基準に、降順でソートする際、
2013/06/10
2013/06/5
という順番になるはずが
2013/06/5
2013/06/10
という順番になってしまっていました。
原因は 降順ソート(rsort) を用いて「10」と「5」を比較する際、
「10」は「1」から始まる文字列である、と認識してしまったからです。
したがって、「5」が「10」より先頭に来てしまった、と考えられます。
そこで、数値を数値として認識する自然順ソート(natsort)を用いた後、
逆順にソートすることにより、数値的に正しい降順を実現しました。
(修正前のコード)
<?php chdir('article'); $fname=glob('*.php'); rsort($fname);/*降順*/ print"<ul>"; foreach($fname as $f){ $fstr = file_get_contents($f); $fstr = mb_convert_encoding($fstr,"UTF-8", "auto" ); if ( preg_match( "/<h2>(.*?)<\/h2>/i", $fstr, $matches) ) { $h2= $matches[1]; } $result = file($f); print"<li><a href=article/$f>$h2</a></li>"; } ?>
(修正後)
<?php chdir('article'); $fname=glob('*.php'); natsort($fname);/*自然順*/ $fname=array_reverse($fname);/*逆順*/
print"<ul>"; foreach($fname as $f){ $fstr = file_get_contents($f); $fstr = mb_convert_encoding($fstr,"UTF-8", "auto" ); if ( preg_match( "/<h2>(.*?)<\/h2>/i", $fstr, $matches) ) { $h2= $matches[1]; } $result = file($f); print"<li><a href=article/$f>$h2</a></li>"; } ?>
・修正版アルゴリズム
①articleフォルダ内の記事ファイルの名前(ファイル名は日付)を読み込み、自然順にソート。
さらにその配列を逆順にソート。→最新の日付が上方に
②読み込んだ記事ファイル名をもとに、記事ファイルのソースを文字列として読み込んでいく。
③正規表現を用いて、記事ソース中の見出し(<h2>と</h2>で囲まれた文字列)を検索し、見出しの文字列を抜き出す。
④読み込んだファイル名と抜き出した文字列を利用して、リンクを貼る。
今後こんなことがないよう、コードを書くときはテストを挟む癖をつけます…