提高现有功能的性能,Laravel

我尝试重构我的代码,但我的代码表现不佳。目标是获得具有 unique 的数组列表"answer_id",并获得一些“分数”、“投票”等。


在我现有的元素中,我首先检查 $most_voted 是否为 null,如果是,我分配第一个元素,然后我将在第二个元素中插入一个foreach新元素,或者我更新一个现有元素。但是从我的第二个开始foreach,我就过得很糟糕。关于这个逻辑有什么建议吗?


$answers = $history->toArray(); //here I have an array of arrays

$most_voted = [];


foreach ($answers as $key => $answer) {


    if (!empty($most_voted) ) {


        // in this if I create new arrays or I update existing ones 

        foreach ($most_voted as $k => $v) {

            //If value already exists, increase Votes/Score/Percentage

            if (intval($most_voted[$k]['answer_id']) === intval($answer['lkp_answer_id'])) {


                $most_voted[$k]['Votes'] = $most_voted[$k]['Votes'] + 1;

                $most_voted[$k]['Score'] = $most_voted[$k]['Score'] + $answer['score'];

                $most_voted[$k]['Percentage'] = substr((($most_voted[$k]['Votes'] * 100) / $votes), 0, 5);

                $most_voted[$k]['Weight'] = substr((($most_voted[$k]['Score'] * 100) / $total_scoring), 0, 5);


                //Else add new array element

            } else {

                $name = LkpAnswer::where('id', '=', $answer['lkp_answer_id'])->pluck('name');

                (isset($name[0]) && $name[0] !== null) ? $name = $name[0] : '';                


                if(! empty($answer['lkp_answer_id'])){


                    $most_voted[$key] = [

                        'answer_id' => $answer['lkp_answer_id'],

                        'Name' => $name,

                        'Votes' => 1,

                        'Score' => $answer['score'],

                        'Percentage' => substr(((1 * 100) / $votes), 0, 5),

                        'Weight' => substr((($answer['score'] * 100) / $total_scoring), 0, 5),

                    ];

                }

            }

        }

    } 


沧海一幻觉
浏览 76回答 1
1回答

尚方宝剑之说

优化的第一条规则(在我看来),切勿在循环内运行查询。在循环开始之前:// Fetch all data at once and use select() whenever possible$LkpAnswers = LkpAnswer::whereIn('id', collect($answers)->pluck('lkp_answer_id')->toArray())->select('name')->get();在你的其他条件下(在第二个循环内)做这样的事情。// Before, this query was inside 2 for loops (n^2). For every n, there's 1 query.// This right here is a Collection of LkpAnswer::model. Collection is very useful for optimization$name = $LkpAnswers->where('id', $answer['lkp_answer_id'])->pluck('name')->toArray();使用它并更改您的第二个 else 条件。仅通过这样做,您将减少近 50% 的运行时间。另请查看有关如何在 laravel 中进行优化的答案。它讨论了缓存、索引、select()和类型转换。让我在下面的评论中发布。
打开App,查看更多内容
随时随地看视频慕课网APP