Home > 覚え書き > PHP覚書:二次元配列のソート

PHP覚書:二次元配列のソート

いよいよ、特定の項目をソートさせる部分にさしかかりました。
これが完了すれば、後はすんなり進むと自分に言い聞かせているのですが、ここでも壁にぶちあたりました。
とほほ。。

色々調べていると、特定の項目でソートするには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;
}

ふう、次はページ送りではまりそうな予感・・。

Comments:0

Comment Form

コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。

Trackbacks:0

TrackBack URL for this entry
http://www.01sound-earth.com/01sys/mt-tb.cgi/225
Listed below are links to weblogs that reference
PHP覚書:二次元配列のソート from WEB・音楽業界ニュース&私的コラム

Home > 覚え書き > PHP覚書:二次元配列のソート

Search
Feeds

Return to page top