如何对Laravel集合去重后按元素重复次数从高到低排序
Laravel 集合去重后按出现次数降序排序实现方案
完整实现代码
$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'], ]); // 统计每个唯一元素的出现次数(按id作为唯一标识,若需多字段判断可调整拼接规则) $counts = $collection->countBy(fn($item) => $item['id']); $result = $collection ->unique('id') // 去重,和你目前的用法保持一致 ->map(fn($item) => [...$item, 'occur_count' => $counts[$item['id']]]) // 追加临时计数字段 ->sortByDesc('occur_count') // 按出现次数降序排序 ->forget('occur_count') // 移除临时计数字段 ->values(); // 重置集合的数字索引
多字段唯一判断适配
如果元素的唯一性需要同时校验多个字段(比如id和name同时一致才算同一个元素),调整countBy和unique的逻辑即可:
// 按id+name组合判断唯一性 $counts = $collection->countBy(fn($item) => $item['id'] . '|' . $item['name']); $result = $collection ->unique(fn($item) => $item['id'] . '|' . $item['name']) ->map(fn($item) => [...$item, 'occur_count' => $counts[$item['id'] . '|' . $item['name']]]) ->sortByDesc('occur_count') ->forget('occur_count') ->values();
实现逻辑说明
- 用
countBy方法统计每个唯一元素的出现次数,提前把计数结果存在独立的变量里避免重复计算 - 调用
unique方法完成集合去重,符合你已有的使用习惯 - 追加临时计数字段作为排序依据,排序完成后直接删除该字段不影响原数据结构
- 最后调用
values()重置集合索引,避免返回的集合索引不连续
内容的提问来源于stack exchange,提问作者Fahad Shaikh
相关产品推荐
相关产品推荐

