在数组的数组中通过消去进行二次排序



我正在根据下面的json示例数据编写高尔夫排名排行榜。我可以很容易地将分数从低(最好)到高(最差)进行排序,但是当涉及到"分数"时。这就是我想弄明白的问题。

这里有一个快速的背景:数组[0]是最终得分,数组[1]是队号(T1,T2等),数组[2]-[10]是每个洞的连续击球数。把连续的镜头加起来,然后减去36,等于每个队的array[0]。

决胜局现在应该"重新排名"了。按每洞最低杆数顺序。例如,当比较T11、T2和T5时……T2在第一个连续洞打出了3杆,而T11和T5打出了4杆,因此应该排在整体第二。现在T2被"重新排序"了。作为整体第二名,T11现在将与T5进行下一个"重新排名"。所有打平的球队都是如此。如果有人能给我一个场景,我不是在寻找一个脚本,只是基本上需要临时提取按平局分数分割的平局球队,即提取T11, T2和T5(-5分数)进行比较,提取T10和T9(-4分数)以及T!, T3, T4, T7(-3分)重新排名,然后把那些"重新排名";在不干扰未按原始排名进行比较的队伍的情况下,即T8(-7分)和T6(-1分)。

{
[-7,"T8","4","3","3","4","4","2","3","3","3"],
[-5,"T11","4","3","4","4","4","3","3","3","3"],
[-5,"T2","3","3","4","4","4","3","3","4","3"],
[-5,"T5","4","4","3","4","4","3","4","3","2"],
[-4,"T10","4","3","4","4","4","2","4","4","3"],
[-4,"T9","4","3","3","4","5","3","3","3","4"],
[-3,"T1","5","3","3","4","4","3","4","4","3"],
[-3,"T3","4","3","4","4","4","3","4","4","3"],
[-3,"T4","4","3","3","4","5","3","4","3","4"],
[-3,"T7","4","4","4","4","3","3","4","4","3"],
[-1,"T6","4","3","3","4","5","4","4","4","4"]
}

谢谢。

一种简单的方法是将数组的顺序镜头部分的比较添加到排序比较函数中。

usort($data, function($a, $b) {
return ($a[0] <=> $b[0]) ?: (array_slice($a, 2) <=> array_slice($b, 2));
});

第一部分,$a[0] <=> $b[0]只是比较第一个元素,我想这就像你已经在做的那样。

第二部分array_slice($a, 2) <=> array_slice($b, 2)只有在第一部分因为?:运算符相等时才会被求值。

数组切片可以直接比较,因为在PHP中比较数组的方式恰好就像您想要比较连续镜头的方式一样,如果我理解正确的话。只要数组大小相同,它们每次只比较一个元素,从左到右(这在"与各种类型的比较"中有描述;


如果可能的话,我认为如果你可以用球队编号来索引数据会更方便,比如

[
"T8"  => [-7,"4","3","3","4","4","2","3","3","3"],
"T11" => [-5,"4","3","4","4","4","3","3","3","3"],
...
]

那么你所需要的排名将是

asort($data);

最新更新