2014-09-22 116 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