根据重复计数对集合进行区分和排序

Posted

技术标签:

【中文标题】根据重复计数对集合进行区分和排序【英文标题】:Distinct and sort collection based on duplicate count 【发布时间】:2022-01-11 18:56:32 【问题描述】:

我有以下收藏

$collection = collect([
    ['id' => 1, 'name' => 'Design'],
    ['id' => 2, 'name' => 'Art'],
    ['id' => 3, 'name' => 'Comms'],
    ['id' => 2, 'name' => 'Art'],
    ['id' => 3, 'name' => 'Comms'],
    ['id' => 3, 'name' => 'Comms'],
]);

我只想要集合中唯一的项目,并且集合应该按重复的数量排序。因此,重复次数最多的项目必须出现在顶部,如下所示

$collection = collect([
        ['id' => 3, 'name' => 'Comms'],
        ['id' => 2, 'name' => 'Art'],
        ['id' => 1, 'name' => 'Design'],
    ]);

我可以使用unique 方法删除重复项,但找不到想要排序的对象。

【问题讨论】:

或许您应该先对它们进行分组,以便获得计数,然后再映射它们以获得最终结果? 您是如何获得该收藏的。这是需要更改的查询。 您可以在集合中使用sortBy方法对数据进行排序。 【参考方案1】:

你可以用mapWithKeys()做到这一点

https://laravel.com/docs/8.x/collections#method-mapwithkeys

$collection = $collection->groupBy('id')->mapWithKeys(function (Collection $row) 
    return [$row->count() => $row->first()];
)->sortKeysDesc();

【讨论】:

以上是关于根据重复计数对集合进行区分和排序的主要内容,如果未能解决你的问题,请参考以下文章

重复组合计数

根据另一个集合项目对项目进行排序

在Kotlin中按多个字段对集合进行排序[重复]

如何根据数组的成员对集合进行排序

在 Eloquent 中按自定义顺序对集合进行排序 [重复]

根据项目在另一个集合中被引用的次数对项目进行排序