[PHP-users 10573] Re: 多次元配列のソート

Mashiki php-users@php.gr.jp
Sat, 05 Oct 2002 04:22:50 +0900


 Mashikiです。

>「管理番号、登録日付、タイトル、関連URL、掲載フラグ」といった
>項目を持つCSV形式のファイルを読み込み、配列にいったん格納し表示する
>プログラムを組んでいます。
>$information_arrayという多次元配列に
>
>$information_array[]["info_code"]
>$information_array[]["info_regist_date"]
>$information_array[]["info_subject"]
>$information_array[]["info_related_url"]
>$information_array[]["info_operation"]
>
>という添字をつけているのですが、複数の行を登録日でソートしようとした
>場合に、array_multisortを使用したのですが、うまくいかないんです。

「うまくいかない」でなく「どうなる」と書いたほうがMLでのうけがよくなるよ
うですね。

>多次元の配列をソートする際は、
>array_multisort ($information_array[]["info_regist_date"], SORT_DESC,
>SORT_REGULAR);
>といった書き方ではいけないのでしょうか?


この場合は、普通、usortを使うと思います。
http://www.php.net/manual/ja/function.usort.php

>array_multisort ($information_array[]["info_regist_date"], SORT_DESC,
>SORT_REGULAR);

の代わりに、

usort($information_array, 'sort_by_regist_date');

などと呼び出し、phpのどこかで、大小関係のルール、sort_by_regist_date
を関数の形で定義します。

日付が数値、またはUNIXタイムスタンプとして格納されているなら
function sort_by_regist_date($p1, $p2) {
    return ($p1['info_regist_date'] - $p2['info_regist_date']);
}

日付が区切り文字を含む桁数のそろった文字型で格納されているなら、
function sort_by_regist_date($p1, $p2) {
    if ($p1['info_regist_date'] == $p2['info_regist_date']) return 0;
    return ($p1['info_regist_date'] > $p2['info_regist_date']) ? -1 : 1;
}

普通に日付に変換できるようなフォーマットの文字列なら
function sort_by_regist_date($p1, $p2) {
    return strtotime($p1['info_regist_date'])
         - strtotime($p2['info_regist_date'])
    );
}

な要領で。

サブジェクトやコード、複数のフィールドの組み合わせなどでのソートも
比較関数を用意すればどうにでも拡張できます。