【问题标题】:How can I do a ranking on array values without ties?如何在没有关系的情况下对数组值进行排名?
【发布时间】:2016-01-17 09:36:32
【问题描述】:

我有一个代表排名或位置的数组(例如在游戏或竞赛中):

rank = [1,3,2,1]

我希望输出如下:

rank = [1,4,3,2]

这意味着,对于任何平局,平局会因每个其他平局而被打破 并且所有其他后续位置也加一。这是一个简单的映射分配。

其他情况:

rank = [1,1,2,3] -> [1,2,3,4]
rank = [2,1,2,3] -> [2,1,3,4]
rank = [2,1,2,3] -> [2,1,3,4]
rank = [1,1,1,1] -> [1,2,3,4]

【问题讨论】:

  • 你背后的逻辑是什么?
  • 模式背后的逻辑是什么
  • @YounasBangash 每个排名的逻辑应该是 1,2,3,4 或其他排列,没有关系排名
  • 你有什么努力吗?这很简单。
  • @emon 你是这样操作的:sandbox.onlinephpfunctions.com/code/…(基本上:从第二个元素开始增加第一个元素中的值)。

标签: php sorting ranking


【解决方案1】:

试试这个:

<?php

class Ranker 

{
private $rank, $result, $doWork;

public function rank() {

    $rank = array(
        "slot1" => 1,
        "slot2" => 1,
        "slot3" => 1,
        "slot4" => 1
        );
    $result = array();

    asort($rank);

    /* Get funky */
    foreach ($rank as $place) {

        $initialplace = $place;

        if (!empty($result)) {
             {
                while(in_array($place, $result)) {
                    $place++;
                    if (!in_array($place, $result)) {
                        break;
                    } 
                }
            }

            foreach (array_keys($rank, $initialplace) as $key) {

                if (!array_key_exists($key, $result)) {
                    $result[$key] = $place;
                    break;
                }

            }
        } else {
            /* array_search always returns first match */
            $result[array_search($initialplace, $rank)] = $initialplace;
        }
    }

    ksort($result);

    /* Printing it out */
    foreach ($result as $finalplace) {
        echo $finalplace . ' ' . array_search($finalplace, $result) . '</br>';
    }
}
}

/* Execute class function */
$ranker = new Ranker;
$doWork = $ranker->rank();

?>

好的,所以这主要是有效的,与上述映射的唯一偏差是它会分配平局以略有不同,但我认为这并不重要。例如:

    $rank = array(
        "slot1" => 1,
        "slot2" => 1,
        "slot3" => 1,
        "slot4" => 1
        );

将返回:

4 slot1
3 slot2
2 slot3
1 slot4

而不是 [1, 2, 3, 4]。由于他们都是并列的并且具有相同的“初始排名/位置/其他”,我似乎并不认为这特别糟糕 - 也就是说,您决定如何分配第二个获得“1”或第四个等等。

无论如何,这是一个业务逻辑决策,并且由于您没有分享用例是什么,所以我真的不能说更多。但是,您似乎在实际“打破”关系方面具有一定的灵活性。因此,如果您的用例和业务逻辑是灵活的,则此方法有效。否则,您可以稍微修改它以更符合上面列出的精确映射。

【讨论】:

    猜你喜欢
    • 2014-07-28
    • 1970-01-01
    • 2019-02-17
    • 2020-01-25
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2022-12-31
    相关资源
    最近更新 更多