对“只显示5个活跃用户数,未正确排序”的BUG进行修复

这里遇到的BUG,首先显示出来的活跃用户数是 5 个,其次是没有正确地按照分数进行排序。

教程里面出现问题的排序方法如下图

private function calculateActiveUsers()
    {
·
·
·

        // 数组按照得分排序
        $users = Arr::sort($this->users, function ($user) {
            return $user['score'];
        });
·
·
·

这个方法将数组的key打乱了,如下图,重新从key=0开始排序了

关于“为什么显示出来的活跃用户数是 5 个”的BUG进行修改

我们要的是user_id作为key值的,如下图才是我们要的

关于“为什么显示出来的活跃用户数是 5 个”的BUG进行修改

后面的代码中

 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个按照分数倒序排序的用户。

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!