You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:27:02