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