对“只显示5个活跃用户数,未正确排序”的BUG进行修复
这里遇到的BUG,首先显示出来的活跃用户数是 5 个,其次是没有正确地按照分数进行排序。
教程里面出现问题的排序方法如下图
private function calculateActiveUsers()
{
·
·
·
// 数组按照得分排序
$users = Arr::sort($this->users, function ($user) {
return $user['score'];
});
·
·
·
这个方法将数组的key打乱了,如下图,重新从key=0
开始排序了
我们要的是user_id
作为key值的,如下图才是我们要的
后面的代码中
foreach ($users as $user_id => $user) {
// 找寻下是否可以找到用户
$user = $this->find($user_id);
// 如果数据库里有该用户的话
if ($user) {
// 将此用户实体放入集合的末尾
$active_users->push($user);
}
}
查找$this->find(0)
就会返回null,所以导致我们原本要取6个用户,结果只返回了5个。
修改的方案:
我在app\helpers.php
放了一个辅助函数,搬运了PHP 二维数组排序保持键名不变这篇文章里的代码。
/**
* @desc arraySort php二维数组排序 按照指定的key 对数组进行自然排序
* @param array $arr 将要排序的数组
* @param string $keys 指定排序的key
* @param string $type 排序类型 asc | desc
* @return array
*/
function arraySort($arr, $keys, $type = 'asc')
{
$keysvalue = $new_array = array();
foreach ($arr as $k => $v) {
$keysvalue[$k] = $v[$keys];
}
$type == 'asc' ? asort($keysvalue) : arsort($keysvalue);
foreach ($keysvalue as $k => $v) {
$new_array[$k] = $arr[$k];
}
return $new_array;
}
在方法中调用该辅助函数
private function calculateActiveUsers()
{
$this->calculateTopicScore();
$this->calculateReplyScore();
$users = array_slice(arraySort($this->users,'score','desc'),0,6,true);
$actives_users = collect();
foreach($users as $user_id=>$user){
$user = $this->find($user_id);
if($user){
$actives_users->push($user);
}
}
return $actives_users;
}
最后我们得到了6个按照分数倒序排序的用户。