2014-09-22 96 views
0

从用户列表中,我需要根据谁先进来并根据我剩下的点数给出点数。MYSQL + PHP:数组和循环

我在想......

  1. 获取新用户的列表,并计算积分给予。
  2. 将这些点加入昨天遗留的任何点。
  3. 生成旧用户和新用户的列表。
  4. 通过用户循环,并根据谁先进来给予他们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 

正如你所看到的,用户ID在1第一次登录,他得到1分。当UserId 2登录时,UserId 1获取另一个点,UserId 2获取一个点。当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的用户达到10个点达到0之前,请从列表中的用户,然后通过循环再次列出。

我希望我做的意义在这里...

+2

如果用户登录两次,该怎么办? – 2014-09-22 07:28:12

+0

好问题。系统只会将您登录一次。初次登录后的多次登录将被忽略。 – 2014-09-22 07:56:59

回答

0

你已经得到其有资格从数据库中,通过登录日期排序点的用户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跟踪独立于键的数组中的条目的顺序。

然后,您可以更新数据库中的用户。

+0

每次给用户一个点时,必须保存该交易的记录。这就是为什么我正在寻找一个循环来完成这项工作...... – 2014-09-22 09:24:30

+0

您是否需要生成表记录或写入日志文件? – andy 2014-09-22 09:35:19

+0

每次向用户发出一个点时都会生成一条记录。 – 2014-09-22 09:45:06