php计算排名,成绩相同需要并列算法

思路:
1、先用usort ,把需要排列的数组按照顺序排好
2、开始计算排名,如果并列名次一致,那么排名也应该和上次一样,

     /* 原始数组
     $retData = {
		"nocId": "5",
		"gold": "46",
		"silver": "37",
		"bronze": "38",
		"total": "121",
		"nocName": "美国",
		"nocShortName": "USA",
		"nocLogo": "https://sports3.gtimg.com/kokyooly/noc/5.png",
		"nocUrl": "",
		"nocRank": "1",
		"nocGoldRank": "1",
		"nocSilverRank": "1",
		"nocBronzeRank": "1"
		},
		{
		"nocId": "26",
		"gold": "29",
		"silver": "18",
		"bronze": "26",
		"total": "73",
		"nocName": "中国",
		"nocShortName": "CHN",
		"nocLogo": "https://sports3.gtimg.com/kokyooly/noc/26.png",
		"nocUrl": "",
		"nocRank": "2",
		"nocGoldRank": "2",
		"nocSilverRank": "3",
		"nocBronzeRank": "2"
		},
		{
		"nocId": "211",
		"gold": "27",
		"silver": "23",
		"bronze": "17",
		"total": "67",
		"nocName": "英国",
		"nocShortName": "GBR",
		"nocLogo": "https://sports3.gtimg.com/kokyooly/noc/211.png",
		"nocUrl": "",
		"nocRank": "3",
		"nocGoldRank": "3",
		"nocSilverRank": "2",
		"nocBronzeRank": "5"
	}
     */
    
    1//先用usort ,把需要排列的数组按照顺序排好
     usort($retData ,'cmpTotalDesc');
	function cmpTotalDesc($a,$b){
	    if($a['total'] != $b['total']) {
	        return $a['total']>$b['total'] ? -1:1;
	    } elseif($a['gold'] != $b['gold']) {
	        return $a['gold']>$b['gold'] ?  -1:1;
	    } elseif($a['silver'] != $b['silver']) {
	        return $a['silver']>$b['silver'] ? -1:1;
	    } elseif($a['bronze'] != $b['bronze']) {
	        return $a['bronze']>$b['bronze'] ?  -1:1;
	    }else{
	        return $a['nocShortName']>$b['nocShortName'] ?  1:-1;
	    }
	}
 

   // 2、开始计算排名,如果并列名次一致
       $this->getRank($retData,'total','nocRank');
    /**
     * 计算排名:
     * 
     * @param $rank 已排好的顺序
     * @param $key 按哪个值排序
     * @param $rankKey 排好的名次赋值的key
     */
     function  getRank(&$retData,$key,$rankKey){
          $temp="";                        //临时变量 ,记录每次需要比较大小的数值,
          $num=0;                            //自然排序变量,原始的不计并列排名的值
          $finalNum=0;                    //最终排名变量 ,最终输出的排名
          $tempNum=0;                        ///记录相等排名的增量,temp等于上次的值,则这个变量加一,用于记录有几个变量并列
        foreach ($retData as &$value){

            if($temp==$value[$key]){

                $tempNum++;
                $finalNum =$num;
            }else{
                $temp= $value[$key];
                $num++;
                $finalNum=$num+$tempNum;         //最终排名为自然排名加上之前的相等记录增量
                $num=$finalNum;                  //将自然排名设置为最终排名的数上
                $tempNum=0;
            }
//            var_dump("temp".$temp);
//            var_dump("num".$num);
//            var_dump("finalNum".$finalNum);
//            var_dump("tempNum".$tempNum);
//            var_dump($rankKey);
            $value[$rankKey]= strval($finalNum);
        }

    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值