ランキング集計ロジックを作りたくて実装を進めていた
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:最終的に取得したいソート済みの値
うーーーーーん、なんかもっときれいに書ける気がする...