• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP如何根据用户积分快速判断用户等级?

php 搞代码 3年前 (2022-01-23) 28次浏览 已收录 0个评论
文章目录[隐藏]

根据用户积分判断等级

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

如何快速高效低根据用户的积分来判断等级?if的话判断几条数据还可以,如果到100个if的话,效率就下降了,大家有没有什么好的方法?

回复内容:

根据用户积分判断等级

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

如何快速高效低根据用户的积分来判断等级?if的话判断几条数据还可以,如果到100个if的话,效率就下降了,大家有没有什么好的方法?

<body>

看到大家都特别积极帮我解决这个问题真的特别感谢。这一栏叫“撰写答案”,其实也不算答案,只是解决了我的需求了。
这个解决方法其实是根据用户的在线时长来判断用户的等级,满足一定的时长就升级到多少级别,后来决定用这种方法来判断用户的等级时长:当前等级的平方,为下一等级所需的时长数。
最后根据时长来求用户等级

<code class="php">(int)sqrt($onlinetime)+1;</code>

<code><?phpfunction 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  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' <mark>(本文来)源gaodaimacom搞#^代%!码&网(</mark><pre>搞gaodaima代码

=> 999999999, ‘min’ => 100000, ‘name’ => ‘将军’, ‘level’ => 6], ]; foreach ($level as $value) { if (($point >= $value[‘min’]) && ($point < $value['max'])) { return $value; } } }

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

<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>

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP如何根据用户积分快速判断用户等级?

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址