我接受了学术任务。基本上,我想通过一个过程/函数/服务获取一个名为'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中的初始映射?