思路:
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);
}
}