根据用户积分判断等级
<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的话,效率就下降了,大家有没有什么好的方法?
看到大家都特别积极帮我解决这个问题真的特别感谢。这一栏叫“撰写答案”,其实也不算答案,只是解决了我的需求了。
这个解决方法其实是根据用户的在线时长来判断用户的等级,满足一定的时长就升级到多少级别,后来决定用这种方法来判断用户的等级时长:当前等级的平方,为下一等级所需的时长数。
最后根据时长来求用户等级
(int)sqrt($onlinetime)+1;
<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]</code>
}
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>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把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

Dreamweaver CS6
视觉化网页开发工具

禅工作室 13.0.1
功能强大的PHP集成开发环境