如何在没有关系的情况下对数组值进行排名?

时间:2016-01-17 09:36:32

标签: php sorting ranking

我有一个代表排名或地点的数组(比如游戏或比赛):

rank = [1,3,2,1]

我希望输出如下:

rank = [1,4,3,2]

这意味着,对于任何绑定的地方,每个其他绑定地点的领带都会被打破 所有其他后续位置也加1。这是一个简单的映射分配。

其他情况:

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]

1 个答案:

答案 0 :(得分:0)

试试这个:

<?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'的人是随意的第四个等等。

无论如何,这是一个商业逻辑决策,而且由于你没有分享用例,我无法真正说出更多相关信息。但是,你似乎在如何“打破”关系方面有一些灵活性。所以这适用于您的用例和业务逻辑是灵活的。否则,您可以稍微修改它以更符合上面列出的精确映射。