PHP 排名算法支持重复排名

有这样的一个数据

$arr = [
    [
        'id'=>1,
        'score'=>10,
    ],
    [
        'id'=>2,
        'score'=>30,
    ],
    [
        'id'=>3,
        'score'=>50,
    ],
    [
        'id'=>4,
        'score'=>50,
    ]
]

你想从小到大,取出前三名,如果第四名和第三名也相同,也取出来

先按score排序

array_multisort(array_column($arr,'score'),SORT_ASC,$arr);

前三名

$n = 3;
$int =3;
$results = array_slice($arr, 0, $n, true);

//前几名是否重复
while (count(array_count_values(array_column($results,'score')))<$n&&(count($results)<count($arr))){
    $results = array_slice($arr, 0, $int++, true);
}

然后前三名的最后一名和之后的比较

$length = count($arr);
$resultLength = count($results);

//$resultLength 比 $length小说明$arr 的还有元素,否则它们俩就相等了。然后比较key和key+1的值。
极限是所有的人都和第三名相同,自行判断是否需要所有人都胜出,来限制 $resultLength 的长度

while($resultLength<$length &&$results[$resultLength-1]['score']==$arr[$resultLength]['score']){
            array_push($results,$arr[$resultLength]);
            $resultLength = count($results);
        }

最后如果要判断某一用户是否胜出

$ifWinner = 0;
if(in_array($id,array_column($results,'id'))){
       $ifWinner = 1;
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
Make everything simple instead of making difficulties as simple as possible
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 7

极限是所有的人都和第三名相同,自行判断是否需要所有人都胜出,来限制 $resultLength 的长度 ????这句话说的很难理解........

6年前 评论

@唐启胤 没有啊,我实际操作过,亲,你是不是弄错了?

6年前 评论

如果第一名或第二名有重复的呢?

6年前 评论
jcc123

@lucky_ss 限制有几个人胜出
比如限制10人

while($resultLength<10&&$resultLength<$length &&$results[$resultLength-1]['score']==$arr[$resultLength]['score']){
            array_push($results,$arr[$resultLength]);
            $resultLength = count($results);
        }
6年前 评论
jcc123

@唐启胤 谢谢指出,已解决

6年前 评论

感觉楼主问题复杂化了 拍完序后 获取前三名的分数 再判定一下 就能实现你现在的效果了 结构array:3 [▼
分数 => array:3 [▶]
分数=> array:1 [▶]
分数=> array:2 [▶]
] 这样是不是要好点 个人建议哈

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!