PHP如何根據使用者積分快速判斷使用者等級?

WBOY
發布: 2016-08-04 09:21:26
原創
3578 人瀏覽過

依使用者積分判斷等級

<code>lv1:1~50
lv2:51~110
lv3:111~180
lv4:181~260
......
依次类推直到lv100</code>
登入後複製
登入後複製

如何快速高效低根據用戶的積分來判斷等級? if的話判斷幾個數據還可以,如果到100個if的話,效率就下降了,大家有沒有什麼好的方法?

回覆內容:

依使用者積分判斷等級

<code>lv1:1~50
lv2:51~110
lv3:111~180
lv4:181~260
......
依次类推直到lv100</code>
登入後複製
登入後複製

如何快速高效低根據用戶的積分來判斷等級? if的話判斷幾個數據還可以,如果到100個if的話,效率就下降了,大家有沒有什麼好的方法?

看到大家都特別積極幫我解決這個問題真的特別感謝。這一欄叫“寫答案”,其實也不算答案,只是解決了我的需求了。
這個解決方法其實是根據用戶的在線時長來判斷用戶的等級,滿足一定的時長就升級到多少級別,後來決定用這種方法來判斷用戶的等級時長:當前等級的平方,為下一等級所需的時長數。
最後根據時間長度來求使用者等級

<code class="php">(int)sqrt($onlinetime)+1;</code>
登入後複製

PHP如何根據使用者積分快速判斷使用者等級?

<code><?php
function getLevel($point) {
    $level = 0;
    while($point >= 0) {
        $point -= 50 + $level++ * 10;
    }
    return $level;
}</code>
登入後複製

建議直接在資料庫中維護儲存使用者等級信息,不然使用簡單的範圍查詢SQL可能導致你的索引失效。

資料如果沒規律不想存資料庫就用二分查找,找到所有等級的中間等級的積分上限,如果用戶積分大於這個上線的話就遞歸查找比這個等級大的等級,否則就遞歸查找比這個中間等級小的等級。 。

評論裡的「積分/50演算法」顯然是不能滿足樓主的積分等級判斷的,因為積分等級法則可能會變動,而且這個演算法本身就有問題。

有序的資料查找可以用二分法來查找,給你一個簡單實現的程式碼

<code><?php

/**
 * 二分法查找
 *
 * @param int $score 积分
 * @param array $filter 积分规则
 *
 * @return array $filter
 */
function search($score, $filter)
{   
    $half = floor(count($filter) / 2); // 取出中間数

    // 判断积分在哪个区间
    if ($score <= $filter[$half - 1]['max']) {
        $filter = array_slice($filter, 0 , $half);
    } else {
        $filter = array_slice($filter, $half , count($filter));
    }

    // 继续递归直到只剩一个元素
    if (count($filter) != 1) {
        $filter = search($score, $filter);
    }

    return $filter;
}


$filter = [
    ['level' => 1, 'min' => 1, 'max' => 50],
    ['level' => 2, 'min' => 51, 'max' => 110],
    ['level' => 3, 'min' => 111, 'max' => 180],
    ['level' => 4, 'min' => 181, 'max' => 260],
    ['level' => 5, 'min' => 261, 'max' => 500],
];

$result = search(240, $filter);
echo current($result)['level'];

</code>
登入後複製

1.在用戶表冗餘一個等級字段,每次新增積分的時候順帶判斷下,如果等級提升了就加1,這個算是實時的一個方案

2.如果允許等級提升延遲,建議用定時任務或非同步隊列處理計算,因為積分長遠看或許還是比較有負載的,算是提前規劃了

我覺得 如果你真實要做這個透過積分得到等級 建議你直接全部定義鍵值對 利用空間換時間。實際業務邏輯 不會有很多等級,根本不需要什麼演算法。這是效能最高的做法,這個陣列你自己寫程式碼產生下就ok了
$arr[1]=「lv1」;$arr[2]=「lv1」;.......$arr[50 ]="lv1";
$arr[51]=“lv2”;$arr[52]=“lv2”;.......$arr[110]="lv2";
...
. ..
...
...

規則呢?沒有規矩,不成方圓

= = 第一個想法是用switch語句,看了2樓的感覺自己好low 還需要繼續學習啊

用資料庫吧,靠譜點。循環和if判斷性能都達不到。資料庫儲存100個資料小case,查詢也很輕鬆。另外你數據的這種規律,並不適合在程式裡進行判斷。

我是採取的樓上第一個解決方案

$rules = array(

<code>[1]=>array(1,50),
[2]=>array(51,110),
[3]=>array(111,180)</code>
登入後複製

)
99積分
遍歷數組
foreach($rules as $k=>$v){

<code>if($v[1]<99<$v[2]){
    //这里可以取出等级
}</code>
登入後複製

}

<code class="php">function getLevel($point)
    {
        $level = [
            0 => ['max' => 1000, 'min' => 0, 'name' => '新手', 'level' => 1],
            1 => ['max' => 10000, 'min' => 1000, 'name' => '小将', 'level' => 2],
            2 => ['max' => 20000, 'min' => 10000, 'name' => '中将', 'level' => 3],
            3 => ['max' => 50000, 'min' => 20000, 'name' => '上将', 'level' => 4],
            4 => ['max' => 100000, 'min' => 50000, 'name' => '大将', 'level' => 5],
            5 => ['max' => 999999999, 'min' => 100000, 'name' => '将军', 'level' => 6],
        ];
        foreach ($level as $value) {
            if (($point >= $value['min']) && ($point < $value['max'])) {
                return $value;
            }
        }
    }</code>
登入後複製

效率不高,期待更好算法。

<code>public function gradefun($gf)//用户等级函数
{
    $arr = array(120000 => 12, 80000 => 11, 50000 => 10, 30000 => 9, 12000 => 8, 8000 => 7, 5000 => 6, 2500 => 5, 1200 => 4, 500 => 3, 100 =>2, 0 => 1);
    
    foreach ($arr as $key => $value)
    {
        if ($gf >= $key)
        {
            return $value;
        }
    }
}




这个可以解决等级数小的,大的不清楚,没用过。</code>
登入後複製
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!