如何简化一些Haphazard排名逻辑PHP

时间:2016-01-18 02:49:43

标签: php arrays

我接受了学术任务。基本上,我想通过一个过程/函数/服务获取一个名为'rank'的数组,以便以下列方式产生以下输出:

    example 1 : rank = [1,3,2,1] -> [1,4,3,2]
    example 2 : rank = [1,1,2,3] -> [1,2,3,4]
    example 3 : rank = [2,1,2,3] -> [2,1,3,4]
    example 4 : rank = [2,1,2,3] -> [2,1,3,4]
    example 5 : rank = [1,1,1,1] -> [1,2,3,4]

初始数组中的每个元素代表某人在比赛中获得一个位置(如第一名,第二名等)或者说越过终点线。输出数组中的每个元素基本上代表断开的联系。所以,说4个人获得第一名(在例子5中),第一个人/ gal获得第1名,第二个人获得第2名,依此类推。

现在,我有以下半工作代码:

<?php

class Ranker 

{
private $rank, $result, $doWork;

public function rank() {

    /* 
    rank = [1,3,2,1] -> [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]
    */

    $rank = array(
        "person1" => 1,
        "person2" => 1,
        "person3" => 1,
        "person4" => 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 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();

?>

它是半工作的,因为它不严格符合上面列出的映射方案。例如,它需要[1,1,1,1]并吐出[4,3,2,1]。考虑到我需要它的用例具有一定的灵活性,这可能不是真正的问题。但我确实有两个问题:

(1)如何清理我的代码并使其更好/更有效 - (我不是PHP人员)。

(2)如何更改代码以使其更准确地符合上面示例1-5中的初始映射?

0 个答案:

没有答案