【问题标题】:Points ranking in Laravel skip over equal pointsLaravel 中的点数排名跳过相等的点
【发布时间】:2022-10-07 22:27:22
【问题描述】:

我正在尝试在排行榜上创建用户列表。

就我而言,我有相同数量的用户,因此我想跳过下一个X排名数量见下表:

IE

Position | Points
1           100
2            50
2            50
3            30
4            20
4            20
6            10

我几乎到处都看过这个例子,我能找到的壁橱是this SO answer 但是他们似乎已经完成了一半的工作,他们没有显示第二 (2) 个位置或第二个第 5 个位置,我需要显示所有位置。

这是我的代码(我尝试像其他答案一样删除 values() 但它只是使 $key 成为点值)

$ranks = $bets->groupBy('user_id')
                ->transform(function ($userGroup) {
                    // Set initial points value.
                    $points = 0;

                    // Map over the user group.
                    $userGroup->map(function ($user) use (&$points) {
                        // Assign points.
                        $points = $points + $user->points;
                    });

                    // Set the first users points format.
                    $userGroup->first()->user->points = number_format((float) $points, 2, '.', '');

                    // Return the first user.
                    return $userGroup->first()->user;
                })
                ->sortByDesc('points')->groupBy('points')
                ->values()
                ->transform(function ($userGroup, $key) {
                    // Return the transformed usergroup.
                    return $userGroup->transform(function ($user) use ($key) {
                        // Set the user's position.
                        $user->position = $key + 1;
                        // Return the user.
                        return $user;
                    });
                })

电流输出

collection
 array  
   0 => usercollection
     0 => usercollection (position = 1)
   1 => usercollection
     0 => usercollection (position = 2)
     1 => usercollection (position = 2)
   2 => usercollection 
     0 => usercollection (position = 3)
   3 => usercollection 
     0 => usercollection (position = 4)
     1 => usercollection (position = 4)
   4 => usercollection 
     0 => usercollection (position = 5)

预期结果

collection
 array  
   0 => usercollection
     0 => usercollection (position = 1)
   1 => usercollection
     0 => usercollection (position = 2)
     1 => usercollection (position = 2)
   2 => usercollection 
     0 => usercollection (position = 4)
   3 => usercollection 
     0 => usercollection (position = 5)
     1 => usercollection (position = 5)
   4 => usercollection 
     0 => usercollection (position = 6)

【问题讨论】:

    标签: php sql laravel rank leaderboard


    【解决方案1】:

    您可以像这样使用 chunkWhile 函数

    $collection = collect([
            ['position' => 1, 'point' => 100,],
            ['position' => 2, 'point' => 90,],
            ['position' => 2, 'point' => 90,],
            ['position' => 3, 'point' => 80,],
            ['position' => 4, 'point' => 70,],
            ['position' => 4, 'point' => 70,],
            ['position' => 5, 'point' => 60,],
        ]);
    
        $collection = $collection->chunkWhile(function ($item, $key, $chunk){
            return $item['point'] === $chunk->last()['point'];
        });
    

    结果 :

    collect(
            collect(
                ['position' => 1, 'point' => 100,],
            ),
            collect(
                ['position' => 2, 'point' => 90,],
                ['position' => 2, 'point' => 90,],
            ),
            collect(
                ['position' => 3, 'point' => 80,],
            ),
            collect(
                ['position' => 4, 'point' => 70,],
                ['position' => 4, 'point' => 70,],
            ),
            collect(
                ['position' => 5, 'point' => 60,],
            )
        );
    

    【讨论】:

      猜你喜欢
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      相关资源
      最近更新 更多