PHPのarray_multisort関数が激便利だったので紹介

追記:2007-11-08
[を] PHP の array_multisort は Schwartzian Transform 向きかなで鋭い指摘をいただきました。たしかに関数名から言っても「array_multisort」ですから、この例はusort向きでしたね...。
説明のシンプルさを求めるあまり本質が抜けおちてしまってました。反省です。苦しいですが、array_multisortの本質への「前段階」のシンプルな解説としてどうぞ。

array_multisort関数は、sort関数などではソートできないような多次元の配列をソートするためのPHPの関数です。SQLのORDER句に似た動作を配列に対して適用することができます。

たとえばこんな形式の売り上げデータがあったとします。

$sales = array(
2 => array(
'title' => 'ほげほげ1',
'amount' => 3,
),
1 => array(
'title' => 'ほげほげ2',
'amount' => 2,
),
0 => array(
'title' => 'ほげほげ3',
'amount' => 5,
),
);
これをamountの多い順にソートしたいとき、array_multisort関数を使うと比較的すんなりソートできます。

まずはソート用の配列を下準備。

$amounts = array();
foreach ($sales as $v) $amounts[] = $v['amount'];
次にarray_multisortを実行します。返り値は成功か失敗のboolean値で、ソート結果は$salesに入ります。

array_multisort($amounts, SORT_DESC, SORT_NUMERIC, $sales);
$salesは以下のようになります。

array(
0 => array(
'title' => 'ほげほげ3',
'amount' => 5,
),
1 => array(
'title' => 'ほげほげ1',
'amount' => 3,
),
2 => array(
'title' => 'ほげほげ2',
'amount' => 2,
),
)

なお、この関数の引数の構造は一般的ではありません。例えばタイトルで昇順ソートしたいときは以下のように書きます。($titlesはタイトルの配列)

array_multisort($titles, SORT_ASC, $sales);
以下もアリです。動作は上と同じです。

array_multisort($titles, $sales);
ポイントは以下の通り。

  • 最後の引数にソートしたい配列を渡す。(参照渡しになる)
  • ソート順(SORT_ASC,SORT_DESC)や、比較方法(SORT_REGULAR、SORT_NUMERIC、SORT_STRING)は渡したり渡さなかったりする。

さらに複数条件でソートすることもできます。詳しくはPHPマニュアルのarray_multisort関数の解説をどうぞ。

3 Comments

  1. ゆういち
    はじめまして!おかげ様で並び替えが成功しました!わかりやすい説明でした。ありがとうございます。
  2. tiovita
    同じく丁寧な解説に助かりました! マニュアルのデータベース例だとどうにも上手く動かなかったもので^^;
  3. 通行人
    拍手