多次元配列をソートする
とある案件で、配列に格納されたデータをソートする処理が必要になった。
今までは、基本的にデータの保存にはデータベースを使用していたので、配列としてデータを取り扱う以前にデータのソートは完了しているのが常だった。しかし今回データベースを使用せず、CSV形式で与えられていたので、配列に格納されたデータをソートする必要が出てきたわけだ。
実はこの処理、それほど難しいわけではなく、PHPで標準装備の関数で対応できる。それがarray_multisort関数だ。ただコマンド一発!というわけではなく、事前準備が必要となる。処理内容は以下の通り。
foreach ($data as $key => $row) {
$volume[$key] = $row[‘volume’];
$edition[$key] = $row[‘edition’];
}
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
条件としてデータ「$data」が多次元配列で、その各行でいくつかのデータが指定され、かつ、それらのデータのうち「volume」「edition」というキーで与えられた値を元にソートするものとする。
最初のforeach文で、各行の「volume」「edition」のキーで指定された値をあらかじめ全て取り出して、変数に格納しておく必要がある。これを使い、array_multisort関数にデータ、ソート対象を引き渡す。関数が実行されると$dataがソートされている、というわけだ。
この関数、引数の与え方が他の関数とずいぶん違うので、使用する際は注意が必要になる。上記の例では、
—
第1引数:あらかじめ抽出したソート対象の配列
第2引数:ソート方法(昇順、降順)
:(上記2つの繰り返し)
最後の引数:データ
—
となっている。これは時としてこんな具合にもなる
—
第1引数:あらかじめ抽出したソート対象の配列
第2引数:ソート方法(昇順、降順)
第3引数:ソートのフラグ(文字列として、数値として等)
:(上記3つの繰り返し)
最後の引数:データ
—
慣れるまでは注意が必要な関数だ。
2009/11/19 at 1:03 AM
参考にさせていただきました。ありがとうございます。