2011-11-08 34 views
1

我正在寫一個前10名的投票系統。民意調查機構每週都會對他們的前10名進行投票。我應該如何每週存儲他們的投票?也就是說,如何控制投票的存儲週期(mySQL)或我的PHP(5.x +)計算?我之前通過在我設置爲0的服務器上創建一個文件「week.txt」來完成此操作,然後每週運行一次cron作業以更新+1。當我將數據存儲在數據庫中時,我只需加載文件並知道它是哪一週。我在尋找更優雅的東西。我應該如何存儲每週投票數據?

系統必須:

  1. 能夠在一年中的任何時間啓動。
  2. 能夠跳過幾周。
  3. 不需要在計算過程中對週數進行混洗。
  4. 會比1客事件免維護由人,其他(如說:「這是起始日期」,「這是最後一天」,曾經在一個藍色的月亮)。
  5. 使用PHP和MySQL,文件或其它「標準」的服務器項目(除其他編程語言或數據庫)。
  6. 不要求其它軟件(如「安裝軟件X,它這樣做!」)。
  7. 民意調查可能是不懂技術的人,所以要求他們比其他任何東西「請輸入您的前10名」或「編輯您的前10名」是不允許的。
  8. 能夠走在歷年年底順利(例如開始在十一月和結束日)。

其他信息:

  1. 民意調查將只允許單日投票。
  2. 我將運行在多一次民調互相之間有沒有關係,因此可能具有不同的跳躍周。

我之前使用過的系統無法工作,因爲爲了跳過幾周,它需要互動並違反#4,否則不能跳過幾周,從而違反#2。

我想過2個系統,但他們有上述的部分的故障:
系統#2)使用PHP的日期(「W」)時,民意調查投票。因此,第一週他們都得到了第48周(例如),第49周第2周,所以很容易知道哪一週是什麼。問題是有些民意測驗會在歷年內結束,因此我會以48,49,50,51,52,1,2,3,4和上面的#3結束。另外,如果我們跳過了幾周,我們可能會以48,49,50,1,2,3結尾,這違反了上面的#2和#8。

系統#3)然後,我有想法只是存儲他們進入民意調查的日期。我會設定一個日期,以便在第一次投票前一週計算,因此,它只需要計算幾周之間的差異,我就知道週數。但是除非我們改變違反#3的日子,否則沒有簡單的方法可以跳過違反#2的周。

System#4)然後我有了這樣一個想法:當民意調查機構首次投票時,我們只是將它記錄爲他們的第1周投票。當他們接下來投票時,它是第2周,依此類推。如果他們想編輯他們的投票(同一天),他們只需使用編輯按鈕,我們就不會記錄新的投票,因爲他們已經表示它是一個編輯。唯一的問題是,如果民意測驗專員忘記了一週,這意味着我必須進入並更正數據(增加一個空白周或更改他們投票的週數,但違反#4)。這很好地處理了跳過周。也許一個cron工作可以解決這個問題?如果有人忘記了,投票結束後運行的cron作業會在空白的一週進入。可以編程查看輸入的最大週數,如果有任何用戶名沒有那週數,只需輸入空白數據。

如果您可以調整上述任何系統以符合所有標準,那也可以。我正在尋找一種簡單而優雅的免提解決方案。

請索取任何其他澄清信息。

+0

要回答rodneyrhem,輪詢算法#1 = 10分,#2 = 9分,等#10得到1分。 – MECU

+0

投票也只能在1天內進行,所以問題是「投票第三週的投票是什麼?」 – MECU

回答

3

使用週數時,請記住01.01.2012是在52周(不是1)。問題是,如果您希望您的投票在日曆周內得到修正,或者投票開始日期爲7天的偏移量。考慮你的民意調查在星期五開始,並在7天后結束。您將跨過日曆周的障礙,因此您的用戶可能會投票2個「周」。

我可能更喜歡偏移方法,因爲嚴格的日曆綁定通常無濟於事。你想回答「第34周的投票是什麼」或「投票的第三週的投票是什麼」的問題嗎?

計算偏移很簡單:

// 0-based 
$week_offset = floor(time() - strtotime("2011-11-02")/7); 

我不知道你的輪詢算法。我就用加權輪詢證明(1-3星,3爲最佳):

| poll_id | user_id | week_offset | vote | 
|  7 |  3 |   0 | 1 | 
|  7 |  4 |   0 | 3 | 
|  7 |  5 |   0 | 2 | 
|  7 |  3 |   1 | 2 | 
|  7 |  4 |   1 | 2 | 
|  7 |  5 |   2 | 3 | 
|  7 |  5 |   5 | 1 | 

運行像

SELECT 
    poll_id, 
    week_offset, 
    SUM(vote) as `value`, 
    COUNT(user_id) as `count`, 
    AVG(vote) as `average` 
FROM votes_table 
WHERE poll_id = 7 
GROUP BY poll_id, week_offset 
ORDER BY poll_id, week_offset; 

查詢會給你像

| poll_id | week_offset | value | count | average | 
|  7 |   0 |  6 |  3 |  2 | 
|  7 |   1 |  4 |  2 |  2 | 
|  7 |   2 |  3 |  1 |  3 | 
|  7 |   5 |  1 |  1 |  1 | 

現在你可能已經注意到的差距0,1,2,[3],[4],5

當從MySQL抓住這些數據,你必須無論如何迭代結果。那麼問題在哪裏擴展到填充空隙的循環?

<?php 
// your database accessor of heart (mine is PDO) 
$query = $pdo->query($above_statement); 
$results = array(); 
$previous_offset = 0; 
foreach ($query as $row) { 
    // calculate offset distance 
    $diff = $row['week_offset'] - $previous_offset; 

    // make sure we start at 0 offset 
    if ($previous_offset === 0 && $row['week_offset'] > 0) { 
    $diff++; 
    } 

    // if distance is greater than a single step, fill the gaps 
    for (; $diff > 1; $i--) { 
    $results[] = array(
     'value' => 0, 
     'count' => 0, 
     'average' => 0, 
    ); 
    } 

    // add data from db 
    $results[] = array(
    'value' => $row['value'], 
    'count' => $row['count'], 
    'average' => $row['average'], 
); 

    // remember where we were 
    $previous_offset = $row['week_offset']; 
} 
// 0 based list of voting weeks, enjoy 
var_dump($results); 

您可能也可以使用function在MySQL中執行上述權利。

+0

因爲擴展填充空隙的循環比只有「這是第X週數據」的東西更復雜,更復雜。也許它並不重要,如果在顯示期間周標籤由其他內容控制而不是實際的週數/偏移量是多少?只要所有民意調查機構的數據庫中存儲了相同的周/偏移量,計算過程中的組合就很容易。 – MECU

相關問題