ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

ソートのロジックで致命的なミスしてた・・・。

ownerなどでのソート。あれ、ヤヴァイ。アホだ。
えーっと、つまり、一意でない値が入ってくるようなフィールドのソート処理全部。ええ。もう、察しの良い方はとっくに嗤っているかと。

// find系でファイルから読んだデータ($_els)を一行ずつarrayにバラして詰めているところ。
$_k = $_els[$_sort_by]; // $_sort_by はソートで指定されたフィールドに対する配列の添字。
...
// ソート対象の値をキーにして、行データをバラしてarrayにして詰め直している。
$records[$_k] = array( ... );
...
ksort($records); // ORDER_BY_DESC なら krsort

アホかと。馬鹿かと。これ、例えばownerフィールドで、同じ値が連続してたら、ファイルの下の方のレコードでどんどん上書きされていって仕舞いますよね。

orz

うーん・・・ああ、そうか。uksort()使えば良いのか。いや、そもそもソート対象をわざわざキーにする必要もないので連想配列にする必要も無くなる。usort()でイイじゃん。

<?php
//...
// "hoge" が、指定された $sort_by にあたる。
usort($records, create_function('$a, $b', 
    'if ($a["hoge"] == $b["hoge"]) return 0; '.
    'return ($a["hoge"] < $b["hoge"]) ? -1 : 1;'));
//...
?>

おお・・・できた。よっしゃ、えーっと・・・。

・・・

後で直しとこ。ヽ(°▽、°)ノエヘヘヘヘ。