PHP删除重复数组值的最佳性能

时间:2018-07-21 12:26:24

标签: php laravel

在我的Web应用程序中,我有一个功能,在一分钟内执行了100次以上,因此我试图找到一种性能更好的方法。

public static function removeDuplicateFeeds($id, $feeds, $todo)
{
    $actionsHistory = ActionsHistory::whereAccountId($id)->whereActionName($todo)->get();
    if (!empty($actionsHistory)) {
        foreach ($actionsHistory as $history) {
            foreach ($feeds as $key => $feed) {
                if ($history->action_name == $feed['pk']) {
                    unset($feeds[$key]);
                }
            }
        }
    }
}

我也要删除$feeds$actionsHistory中的所有元素。

更新:

在此测试代码中,$feeds数组的第一个索引为"pk":"7853740779",存储在我的数据库中,并且删除重复项后,应删除此项目,但是我将所有$feeds个项目都放入了{也{1}}

$filteredFeeds

3 个答案:

答案 0 :(得分:1)

在不知道提要或数据库记录数的情况下,您将不得不针对数据集测试这些提要或数据库记录的性能,并查看它们是否具有更高的性能。

width

或者如果您的数据库查询返回的记录远远多于提要,则可以尝试利用mysql更快的查询速度,而不是使用php更低的array_filter / foreach速度。

public static function removeDuplicateFeeds($id, $feeds, $todo)
{
    $feeds = collect($feeds); // If $feeds is not already a collection
    $actionsHistory = ActionsHistory::whereAccountId($id)
        ->whereActionName($todo)
        ->select('action_name')  // reducing the select improves performance
        ->get(); // Should return an eloquent collection instance
    if (!empty($actionsHistory)) {
        return $feeds->whereNotIn('pk', $actionsHistory->pluck('action_name'));
    }
    return $feeds;
}

如果以上任何一项都能奏效,最好知道这对您有多快。让我们知道祝你好运。

答案 1 :(得分:0)

您可以尝试使用PHP的array_unique函数。 Source.

答案 2 :(得分:0)

您可以使用集合中的laravel unique()函数构建,请在此处查看更多信息: https://laravel.com/docs/5.6/collections#method-unique

做的事情会保持干净和优雅。