- 2008年6月 7日 01:29
- 覚え書き
いよいよ、特定の項目をソートさせる部分にさしかかりました。
これが完了すれば、後はすんなり進むと自分に言い聞かせているのですが、ここでも壁にぶちあたりました。
とほほ。。
色々調べていると、特定の項目でソートするにはusort関数が適しているようなので、これを使って作業することにしました。
予断ですがCGIと違ってPHPはやりたいと思うことが関数で準備されているので非常にありがたいです。
usortはユーザー定義関数を使用して自由にソートができる優れものなので、すぐに導入できると甘い考えを抱きながらカタカタキーボードをたたきました。
まずはユーザー定義関数を準備、今回は3つ目の配列を基準にソートさせるよう設定。
配列は0から始まるので3つ目の場合キーは2になります。
function cmp($a, $b){
return strcmp($a[2], $b[2]);
}
そしてusortを使用。
usort($array, "cmp");
うまくいっているか書き出してみる。
while (list($key, $value) = each($array)) {
echo "
\$array[$key]: " . $value[0] ."|" . $value[1] ."|". $value[2] ."|". $value[3] ."|". $value[4] ."|". $value[5] ."|". $value[6] ;
}
お!
珍しく1発OK!?
と思ったのですがなんだか変です。
ダウンロードカウンター用なのでソートの対象としたのはダウンロード数をカウントしている数字が対象なのですが、桁が変わると思うようにソートされていないのです。
つまり9、7、8、10、をソートするとなぜか
10、7、8、9と表示されるのです。
むむむ、この10は何だと色々テストしていると桁数を合わせるとうまく表示されることがわかりました。
つまり07、08、09、10こんな感じ。
さては数値ではなく文字列として扱っているのでは?という考えに行き着きあれこれ調べていると設定したユーザー定義関数が文字列比較になっていたことが判明。
早速サンプルを元に作り変え見事回避できました。
数が多いものを上に持って来たかったので1 : -1の部分を調整し完了です。
function number_cmp( $a, $b ) {
return $a[2] == $b[2] ? 0 : $a[2] < $b[2] ? 1 : -1;
}
ふう、次はページ送りではまりそうな予感・・。
- Newer: PHP覚書:ランキング表示ページ完成
- Older: PHP覚書:二次元配列