「記事一覧自動生成のバグ修正」 2013/06/11

 昨日、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>で囲まれた文字列)を検索し、見出しの文字列を抜き出す。

④読み込んだファイル名と抜き出した文字列を利用して、リンクを貼る。



今後こんなことがないよう、コードを書くときはテストを挟む癖をつけます…