我有一个代表排名或地点的数组(比如游戏或比赛):
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]
答案 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'的人是随意的第四个等等。
无论如何,这是一个商业逻辑决策,而且由于你没有分享用例,我无法真正说出更多相关信息。但是,你似乎在如何“打破”关系方面有一些灵活性。所以这适用于您的用例和业务逻辑是灵活的。否则,您可以稍微修改它以更符合上面列出的精确映射。