phpで多次元配列をソートする
例えば、 ある学年の1組、2組、3組の生徒がテストをしたとして、 生徒に対して一意のidと、生徒の組、点数 を多次元配列で表した時に、 ①学年の組ごとに昇順に並べ ②かつ点数順に並べたい みたいな時にどーするのっていう話。
// 多次元配列 // idは一意、groupはクラス、scoreが点数 $tajigen_data = array( '田中' => array( 'id' => '001', 'group' => '2', 'score' => '60', ), '山田' => array( 'id' => '002', 'group' => '2', 'score' => '85', ), '鈴木' => array( 'id' => '003', 'group' => '2', 'score' => '55', ), '佐藤' => array( 'id' => '004', 'group' => '2', 'score' => '72', ), '田島' => array( 'id' => '005', 'group' => '1', 'score' => '63', ), '山村' => array( 'id' => '006', 'group' => '1', 'score' => '88', ), '鈴元' => array( 'id' => '007', 'group' => '1', 'score' => '49', ), '安藤' => array( 'id' => '008', 'group' => '1', 'score' => '75', ), '山元' => array( 'id' => '009', 'group' => '3', 'score' => '58', ), '鈴山' => array( 'id' => '010', 'group' => '3', 'score' => '99', ), '安元' => array( 'id' => '011', 'group' => '3', 'score' => '65', ) );
こういう感じのやつ。 array_multisortっていうのが使えそうだな〜とQiitaを見ててあたりをつけたけど、
つまり
// 多次元配列のあるkeyの値でソートする //例えばgroupでソートすると array_multisort(array_column($tajigen_data, 'group'), SORT_ASC, $tajigen_data); var_dump($tajigen_data);
みたいな感じ。 それだと昇順にはできても、組の括りを保ったまま、スコア降順にできるのか????って思ったんだけど こうするとできる。
foreach ($tajigen_data as $key => $row) { $group[$key] => $row['group']; $score[$key] => $row['score']; } array_multisort($group , SORT_ASC, $score, SORT_DESC, $tajigen_data); var_dump($tajigen_data);
array_multisortの引数に二つのソート条件を入れる。そんで、優先順位(引数の順番)をグループ優先にすると。 は???って感じなんだけど、要は ・引数の順番で優先順位がある ・array_multisortは引数複数指定できる ってわけで。
だけどもそもそもなんでforeachしなきゃだめなんだ?とかいう疑問が降って湧いてくるし、ていうか $keyとか$rowとかどっから出てきたんだよという気持ちで理解に苦しむので、 ちゃんと理解できるように読み解くことにした(結果phpの事なんもわかってなかったので、復習を兼ねて、次の記事でおさらいするぞ!)