読者です 読者をやめる 読者になる 読者になる

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を見ててあたりをつけたけど、

qiita.com

つまり

// 多次元配列のある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の事なんもわかってなかったので、復習を兼ねて、次の記事でおさらいするぞ!)