在开发一个对用户做一个排行版功能,获取某个人是第几名的时候,纠结于怎么实现效率比较高,想到了一个方法。

第一步:取出结果

根据条件把所有符合条件的数据取出来,并进行排序。例如我是根据积分排序

select * from user order by points desc;

执行类似于上述SQL语句,获取结果。

第二步:获取排名

上述结果我们取出后,肯定是一个已经符合排序条件的二维数组(例如:$lists)。建议数组键名,最好是索引数组,好直接获取排名,可使用array_values()函数处理。

我们想要的是获取某一个人的排名

第一种实现

根据传统思路,便利结果,获取排名

/**
 * code .....
 */
$user_id = 10;
$rank = 0;
foreach ($lists as $key => $value) {
		if ($value['user_id'] == $user_id) {
				$rank = $key+1;
		}
		break;
}

//用户id为10的排名
$rank;
/**
 * code .....
 */

这种实现方式,比较传统,效率并不高。

第二种实现

PHP>=5.5

通过函数array_column(),array_search()实现。

首先通过array_column(),获取到所有用户的user_id数组(一维数组),这个数组跟$lists的顺序是一样的,也就是说也是经过排名的.

然后,我们只要获取用户id的key就可以了

$uid = array_column($lists,'user_id');
$rank =  array_search($user_id, $uid);
$rank ++;

两种方式都可以达到效果。

还有其它更高效的实现,有待学习研究。。