首页 > 代码库 > php和mysql仿excel的rank函数
php和mysql仿excel的rank函数
php仿excel的rank函数也是借鉴网上的代码,但是没有二维数组情况下的进行rank排名,所以自己对代码稍微改了一下,可以直接运行试验。
<?php $arr = array( array(‘s‘=>‘99‘,‘r‘=>‘1‘,‘a‘=>‘a‘), array(‘s‘=>‘99‘,‘r‘=>‘1‘,‘b‘=>‘b‘), array(‘s‘=>‘100‘,‘r‘=>‘2‘,‘c‘=>‘c‘), array(‘s‘=>‘101‘,‘r‘=>‘3‘,‘d‘=>‘d‘) ); echo ‘<pre>‘; print_r(rank($arr,‘s‘,‘r‘)); //获得一组数的名次的数组 function rank(array $array,$s,$r){ foreach($array as $k=>$v){ $marr[] = $v[$s]; } foreach($array as $val){ $repeat=get_array_repeats($val[$s],$marr); $num=gt_array_values($val[$s],$marr); $rank[$r]=count($marr)-$num-$repeat+1; $rank2[] = array_merge($val,$rank); } return $rank2; } //获得比自己数小的个数 function gt_array_values($val,array $array){ $num=0; for($i=0;$i<count($array);$i++){ if($val>$array[$i]){ $num++; } } return $num; } //获得这个数的重复次数 function get_array_repeats($string,array $array) { $count = array_count_values($array); foreach ($count as $key => $value) { if ($key == $string) { return $value; } } }
逻辑也很简单,学生的名次,等于总人数减去比自己成绩低的人数,再减去和自己成绩一样的人数,再加一。
比自己成绩低的人数,和与自己成绩一样多的人数,分别是两个独立的函数,前者需要循环所有学生成绩,比自己成绩低的进行人数累加,每个学生都要进行这个循环,有点耗性能哈。后者只是单纯引用数组函数解决问题。
这样就可以根据考试成绩(字段名s),得到考生的排名(字段名r),但是很明显循环次数有点多,难以想象当数据量很大的时候情况是怎样的,所以还是建议查询的时候直接执行sql语句实现rank函数功能,这个网上有不少例子,如MySQL中rank函数如何实现
在这个例子中,当我们要查找id为1的学员的rank值的时候,直接运行sql语句如下:
select tmp.id,tmp.name,tmp.score, @j:=@j+1 as j, @k:=(case when @pre_score=tmp.score then @k else @j end) as rank, @pre_score:=tmp.score as pre_score from ( select * from score where id =1 ) as tmp, (select @k :=0,@j:=0, @pre_score:=0) as mscore
j是顺序号,k是rank值
@k:=(case when @pre_score=tmp.score then @k else @j end
这句话意思是只有在前后二次排序值不同时才会使用顺序号,是关键的地方。
最后运行sql,用getRow函数得到id为1的这条数据,得到rank值。
本文出自 “飞天马铃薯神教” 博客,请务必保留此出处http://1105190775.blog.51cto.com/10048144/1891460
php和mysql仿excel的rank函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。