2013-10-14 45 views
0

我正在爲wordpress博客創建升級系統。我相信這個問題更多的是針對Php和數學,而不是wordpress,這就是爲什麼我在這裏問這個問題。簡單的PHP升級進度計算

我希望用戶在評分(或者你可以稱之爲xp)自定義字段達到25的倍數時獲得'等級'()雖然我希望xp要求以指數形式增加,請查看請求# 2,低於)。

我有這個在我的functions.php文件。

function movie_level() { 
    if (is_single()) { 
     global $post; 
     $movie_level = get_post_meta($post->ID, "movie_level", true); 
     if (!isset($movie_level) OR empty($movie_level) OR !is_numeric($movie_level)) { 
    $movie_level = 1; 
    add_post_meta($post->ID, "movie_level", $movie_level); 
     } 
    $vmeta = get_post_meta(get_the_ID(), 'ratings_score', true); 
    $movie_percentage_check = $vmeta/(25*$movie_level) * 100; 
    if ($movie_percentage_check == 100) { 
     $new_level = $movie_level + 1; 
     update_post_meta($post->ID, "movie_level", $new_level); 
     $update_rating = $vmeta + 1; 
     update_post_meta($post->ID, "ratings_score", $update_rating); 
     } return $movie_level; 
    } 
} 

它能做什麼是+1按鈕添加到movie_movie水平時收視率達到25

在我的single.php文件我有以下幾點:

$meta = get_post_meta(get_the_ID(), 'ratings_score', true); 
$level= movie_level(); 
$perc = $meta/(25 * $level) * 100; 

echo '<div class="progress large-6 small-12 columns "><span class="meter" style="width:'.$perc.'%"><span></span></span></div>'; 

echo movie_level(); 

這顯示進度到使用進度條css組件的下一級。

要求

  1. 我怎樣才能讓$達到一個新的水平時,在0%再次PERC開始?用我目前的公式,進度條總是會顯示從級別1 - 級別3(例如)開始的進度,而不是級別2 - 級別3.

  2. 如何更新我的代碼,以便評級要求以指數級增加每個級別,仍然達到我想要的要求#1

+0

您是否嘗試過完成其他請求?如果有的話,也請顯示該代碼。 – naththedeveloper

+0

如果你想用一個「偏移量」來計算值的百分比,那麼當然你必須從兩個值中減去這個偏移量。假設7級開始於400點,8級爲500點,而用戶目前有471點。 500 - 400是100,471 - 400是71 - 使71%「進入」七級。如果值不是像這個例子中那樣「很好地」選擇的話,則工作原理相同。 – CBroe

+0

你的意思是'(5 * $ level)'在第二個代碼塊中應該是'25'嗎?否則,我很困惑,'5'來自哪裏。 – SpaceDog

回答

1

我認爲你跳過一些你不需要的籃球,但首先幾個音符。

movie_level函數中,您正在檢查級別是否需要增加,只有在檢查相關變量發生變化時才執行此操作 - 即在更新movie_levelratings_score時進行更改。您還會返回movie_level,但如果您已添加它,則不會反映+ 1,因此您總是返回舊分數(因爲您使用new_level來存儲新分數)。這可能是你打算的,但我懷疑它不是。

你試圖回答的關鍵問題是 - 到下一級還有多遠?對於25塊,下一層是(movie_level * 25),下一層的金額是(movie_level * 25) - rating_score。作爲一個百分比,它是((movie_level * 25) - rating_score)/25(如果你願意,也許是* 100)。

這與固定塊一起工作,對於指數塊,您可以明確地將下一個目標作爲變量存儲。但是您可以應用與上述相同的邏輯,假定函數level_target(x)返回x級別的目標分數。然後你可以計算出level_target(movie_level) - rating_score還有多遠,但是你需要知道該等級的大小,即level_target(movie_level) - level_target(movie_level - 1)

所以得到的百分比做:(level_target(movie_level) - rating_score)/(level_target(movie_level) - level_target(movie_level - 1))

您可以實現level_target的功能,或工作,你想要什麼,直接將它這將讓你以簡化方程。

指數級別的增加會迅速變大,因此您可能需要在此處達到最大值。但是如果你想

0, 25, 50, 100, 200, 400 ... 

你可以注意到,這相當於

25 * 0, 25 * 1, 25 * 2, 25 * 4, 25 * 8, 25 * 16 ... 

,然後記下序列0,1,2,4,8,16 ...只是增加的權力二。所以level_target(x) = 25 * pow(2,x)

將下一個目標級別作爲單獨變量存儲可能更有用的原因是,您可以將舊目標級別加倍並避免必須執行2個事物的權限(並且可以計算出差異它的水平,因爲它將永遠是水平目標的一半)。

編輯

爲了澄清我的場變化的評論。您只需在rating_score更改後重新計算movie_level(反之亦然),因此通常只會在變更時重新計算變量。

我不知道你的應用程序,但假設只有一個頁面,其中movie_level和/或rating_score的值可以改變(編輯評分頁面,比如說),但有幾十個其他頁面都顯示進度酒吧。如果您僅在值發生更改的頁面上檢查($movie_percentage_check == 100),則不需要檢查其他任何地方(因爲值無法在其他任何地方更改,因此您可以知道它不是真實的)。

檢查所有視圖頁面,特別是對於一個簡單的網站,並不一定是不好的。並且有些情況下你需要(如果系統的某些其他部分可以以某種方式更新這些值)。在一個更復雜的系統中,你想避免做工作,所以你不需要這麼做,只需要「編輯」頁面就可以改變值,'view'頁面應該只讀取/使用這些值。

我可能沒有解釋得那麼好,希望有幫助。

+0

謝謝,數學完美無缺!除了檢測某個領域發生變化以外,我瞭解所有情況。你有我可以參考的例子嗎? 另外我明白你對快速增長的看法,如果我使用指數增長,甚至立方增長也會增加很多。你認爲我應該堅持固定塊嗎? – user28123

+0

增加的選擇實際上取決於你的用戶和你在做什麼。你也可以每次增加一個百分比,25 + 20%的增加值給出0,25,55,91,但是你會以非整數結束,因爲下一個數字是134.2。 – SpaceDog

+0

好吧,我想我明白了。函數應該檢查ratings_score何時改變,而不是經常檢查movie_level爲100。當某人按下帖子頁面上的按鈕來給出*贊成*(通過在插件幫助下通過ajax完成)時,ratings_score會改變。我會做一些挖掘,以找到如何檢測使用php的值的變化。你想要更新我的發現嗎? 另外,25 + 20%給出了合理的增加。將使用intval保持它們爲整數? – user28123