【问题标题】:Secondary ranking by elimination within in an array of arrays在数组数组中通过消除进行二级排序
【发布时间】:2021-08-02 20:58:49
【问题描述】:

我正在根据下面的 json 示例数据编写高尔夫排名排行榜。我可以轻松地将顺序从最低(最好)到最高(更差)排序,但是当涉及到“平局”时,这是我要解决的问题。

这里有一个简单的背景:array[0] 是最终得分,array[1] 是球队编号(T1、T2 等),array[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"]
}

谢谢。

【问题讨论】:

    标签: php arrays json ranking


    【解决方案1】:

    执行此操作的一种简单方法是将数组的连续镜头部分的比较添加到排序比较函数中。

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

    第一部分,$a[0] &lt;=&gt; $b[0] 只是比较第一个元素,我认为这类似于您已经在做的事情。

    由于?: 运算符,只有当第一部分相等时,才会评估第二部分array_slice($a, 2) &lt;=&gt; array_slice($b, 2)

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


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

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

    那么你所需要的排名就是

    asort($data);
    

    【讨论】:

    • 好的,我会尽快实现,看看结果如何。我从来没想过用队号来引用分数数据,谢谢。我试图投赞成票,但收到此错误。感谢您的反馈!您需要至少 15 声望才能投票,但您的反馈已被记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    相关资源
    最近更新 更多