3

好吧,我一直在努力解决这个问题,谷歌搜索试图找到任何可以引导我朝着正确方向前进的东西,但无济于事。

所以我有一个排名排行榜数组,如下所示:

[1] = array('points' => '99', 'rank' => '1');
[2] = array('points' => '90', 'rank' => '2');
[3] = array('points' => '90', 'rank' => '2');
[4] = array('points' => '80', 'rank' => '4');
[5] = array('points' => '70', 'rank' => '5');
[6] = array('points' => '70', 'rank' => '5');

然后我有一个带有预定义数组的奖励积分系统,可以根据排名奖励积分:

[1]=10;
[2]=9;
[3]=8;
[4]=7;
[5]=6;
[6]=5;

如果不是因为平局,我只会匹配两个数组并根据数组键奖励积分。但是,由于我允许绑定,因此我试图在所有绑定用户之间分配绑定奖励积分。因此,根据上述提到的玩家 2 和 3 并列第 2 名,他们将平分奖励点 9 和 8……所以两人都将获得 8.5 分。

所以我在合并两个数组时要寻找的最终结果是:

[1] = array('points' => '99', 'rank' => '1', 'reward' => '10');
[2] = array('points' => '90', 'rank' => '2', 'reward' => '8.5');
[3] = array('points' => '90', 'rank' => '2', 'reward' => '8.5');
[4] = array('points' => '80', 'rank' => '4', 'reward' => '7');
[5] = array('points' => '70', 'rank' => '5', 'reward' => '5.5');
[6] = array('points' => '70', 'rank' => '5', 'reward' => '5.5');

排行榜可以不断变化,直到一天结束,所以我尽量不要让它太复杂。我只是想知道是否有人可以向我指出他们看到的可以帮助我的东西,或者他们是否有任何实施想法。

我在尝试中最挣扎的部分是循环遍历排行榜数组并不断期待“排名”相同,然后知道我需要总结和拆分什么,同时也知道我可以跳过数组,而不是对我刚刚在前瞻中经历的下一个项目执行相同的测试。对不起,如果我感到困惑,但我显然很困惑。

4

2 回答 2

3

这可能是你想要的:

代码

$persons = array(
    array('points' => '99', 'rank' => '1'),
    array('points' => '90', 'rank' => '2'),
    array('points' => '90', 'rank' => '2'),
    array('points' => '80', 'rank' => '4'),
    array('points' => '70', 'rank' => '5'),
    array('points' => '70', 'rank' => '5')
);

$ranks = array(
    1 => 10,
    2 => 9,
    3 => 8,
    4 => 7,
    5 => 6,
    6 => 5
);

foreach($persons as $person => $prop) {
    $reward = $ranks[$prop['rank']];

    if (isset($persons[$person+1])) {
        if ($persons[$person+1]['rank'] == $prop['rank']) {
            $reward = $reward - 0.5;
        }
    }

    if (isset($persons[$person-1])) {
        if ($persons[$person-1]['rank'] == $prop['rank']) {
            $reward = $reward - 0.5;
        }
    }

    $persons[$person]['reward'] = $reward;
}

echo '<pre>';
print_r($persons);
echo '<pre>';

这里发生的是您创建奖励键并根据$ranks数组中的索引用人的等级填充它。这个例子并不安全。您可能需要先检查该键是否存在于$ranks数组中。

这个例子非常“原始”,并且可能没有不同排名的缺陷,因此您必须自己进行最终测试。

输出

Array
(
    [0] => Array
        (
            [points] => 99
            [rank] => 1
            [reward] => 10
        )

    [1] => Array
        (
            [points] => 90
            [rank] => 2
            [reward] => 8.5
        )

    [2] => Array
        (
            [points] => 90
            [rank] => 2
            [reward] => 8.5
        )

    [3] => Array
        (
            [points] => 80
            [rank] => 4
            [reward] => 7
        )

    [4] => Array
        (
            [points] => 70
            [rank] => 5
            [reward] => 5.5
        )

    [5] => Array
        (
            [points] => 70
            [rank] => 5
            [reward] => 5.5
        )

)
于 2013-03-26T18:39:23.330 回答
0

如果超过 2 人可以有相同的等级

$persons = array(
    array('points' => '99', 'rank' => '1'),
    array('points' => '90', 'rank' => '2'), // <---
    array('points' => '90', 'rank' => '2'), // <---
    array('points' => '90', 'rank' => '2'), // <---
    array('points' => '70', 'rank' => '5'),
    array('points' => '70', 'rank' => '5')
);

那么这个@Allendar 算法会给你错误的结果(会给上面输入中排名第 2 的人 8.5 分而不是 8 分和 8.5 分的奖励)。

如果总是有相同的人数和定义的排名数(在这种情况下为 6),您可以使用如下内容:

$persons = array(
    array('points' => '99', 'rank' => '1'),
    array('points' => '90', 'rank' => '2'),
    array('points' => '90', 'rank' => '2'),
    array('points' => '90', 'rank' => '2'),
    array('points' => '70', 'rank' => '5'),
    array('points' => '70', 'rank' => '5')
);

$ranks = array(
    1 => 10,
    2 => 9,
    3 => 8,
    4 => 7,
    5 => 6,
    6 => 5
);

$current_ranks = $ranks;
$rank_pool = array();
$rank_counter = array();

$i = 1; // person counter, start with 1 because $ranks start with 1

// distribute reword equally for all ranks
foreach($persons as $person => $prop) {
  if(!isset($ranks[$i])){
    exit("no reword for this much persons [$i]");
  }

  $rank = $prop['rank'];
  if(!isset($rank_pool[$rank])){
    $rank_pool[$rank] = 0;
  }
  $rank_pool[$rank] += $ranks[$i];
  if(!isset($rank_counter[$rank])){
    $rank_counter[$rank] = 0;
  }
  $rank_counter[$rank]++;

  $i++;
}

// set reword according to equally distributed reword
// points for all ranks
foreach($persons as $person => $prop) {
  $rank = $prop['rank'];
  if(!isset($rank_pool[$rank]) || !isset($rank_counter[$rank])){
    exit('something is wrong!');
  }
  $persons[$person]['reword'] = $rank_pool[$rank]/$rank_counter[$rank];
}


echo '<pre>';
print_r($rank_counter);
print_r($rank_pool);
print_r($persons);
echo '<pre>';

并通过上述输入,您将获得:

$rank_counter=
Array
(
  [1] => 1// --- 1 with rank 1
  [2] => 3// --- 3 with rank 2
  [5] => 2// --- 2 with rank 5
)

$rank_pool
Array
(
  [1] => 10// --- 10 points for persons with rank 1
  [2] => 24// --- 24 points for persons with rank 2
  [5] => 11// --- 11 points for persons with rank 5
)

并且您通过简单划分每个等级的总分和每个等级的计数来获得每人的改写分数

10/1 = 10 points for each person with rank 1
24/3 = 8 points for each person with rank 2
and
11/2 = 5.5 points for each person with rank 5
于 2013-03-26T20:16:18.067 回答