从用户列表中,我需要根据谁先进入以及根据我还剩下多少积分来发放积分。
我在想...
- 获取新用户列表并计算要给予的积分。
- 将这些分数添加到昨天剩余的分数中。
- 生成新老用户列表。
- 循环遍历用户,根据先到者每人给予 1 分,且不超过每人每日积分上限和当天总积分。
现在我已经有 1-3 了,但我在 4 上遇到了麻烦。
完成此任务的最佳方法是什么?
示例数据:
UserId | Points | Date In
1 | 3 | 2014-09-22 12:00:00
2 | 2 | 2014-09-22 12:00:02
3 | 1 | 2014-09-22 01:10:05
如您所见,UserId 1 首先登录,他获得 1 分。当UserId 2登录时,UserId 1获得1分,UserId 2获得1分。当 UserId 3 登录时,UserId 1 会获得另一个积分,UserId 2 和 3 也会获得该积分。这种情况会一直持续到用户达到每日上限或没有更多积分可给予为止。
如果我能得到任何帮助,我将不胜感激...
谢谢!
编辑:我想去的地方的示例:
伪代码:
WHILE points <= 0 {
DO {
list users and distribute points to users by cycling through each one
} WHILE dailypointscap <=10
** 如果用户的 dailypointscap 在积分达到 0 之前达到 10 分,则从列表中删除用户,然后再次循环列表。
我希望我在这里说得有道理......
最佳答案
您已经从数据库中获得了有资格获得积分的用户 ID 列表,并按登录日期排序。假设每个用户都存储在这样的数组中
$users = [
['id' => 1, 'points' => 0],
['id' => 4, 'points' => 0],
['id' => 8, 'points' => 0],
['id' => 2, 'points' => 0],
];
以及$points
中的剩余积分,您可以迭代用户以更新新积分:
$total = 20;
$assigned = [];
do {
foreach($users as $user) {
if (!array_key_exists($user['id'], $assigned)) {
$assigned[$user['id']] = 0;
}
foreach($assigned as $id => $points) {
if($points < 10) {
$assigned[$id]++;
$total--;
}
if ($total == 0) {
break;
}
}
}
} while ($points > 0);
这是可行的,因为 PHP 独立于键来跟踪数组中条目的顺序。
然后您可以更新数据库中的用户。
关于php - MYSQL + PHP : Arrays and Loops,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25968599/