LoginSignup
0

posted at

PHPのin_array,array_column,array_multisortを駆使してランキング集計してソートするロジックを組んだ話

ランキング集計ロジックを作りたくて実装を進めていた

DBのランキングテーブルは下記のような構成になっていて

id no place_id
1 1 abc
2 2 aaa
3 3 bbb
4 1 abc

no(ランキング順)1のものは重みが3
no(ランキング順)2のものは重みが2
no(ランキング順)3のものは重みが1

といった形で集計した結果ポイントが一番高い順に並べるということがしたかった。

このテーブルから

[
    {place_id: 1, point: 4},
    {place_id: 2, point: 2},
    {place_id: 3, point: 1}
]

こんな感じの結果を作りたかった。

        // place_idごとにポイント集計とかする
        foreach ($ranking_records as $ranking_record) {
            if(in_array( $ranking_record->place_id, array_column( $rankings, 'place_id'))){
                for($i = 0;$i < count($rankings); $i++){
                    if($rankings[$i]['place_id'] == $ranking_record->place_id){
                      $rankings[$i]['point'] = $rankings[$i]['point'] + ($ranking_record->no % 3) + 1;
                    }
                }
            }else{
                $array = array('place_id'=>$ranking_record->place_id'point'=>($ranking_record->no % 3) + 1);
                array_push($rankings, $array);                    
            }
        }
        // ソートする
        $points = array();
        foreach ($rankings as $key => $row)
        {
            $points[$key] = $row['point'];
            
        }
        array_multisort($points, SORT_DESC, $rankings);

        return response(array('result' => array('rankings' => $rankings)));

ranking_records:DBから撮ってきた情報
rankings:最終的に取得したいソート済みの値

うーーーーーん、なんかもっときれいに書ける気がする...

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0