在我的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
答案 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
做的事情会保持干净和优雅。