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

Laravel Collection使用unique方法时如何记录重复匹配项日志?

Laravel集合:找出重复姓名组合并输出日志

原代码里的unique()方法是获取去重后的唯一元素集合,但你需要的是定位并输出重复出现的项,不用嵌套foreach的话,可以通过groupBy()配合filter()来实现,比嵌套循环更优雅:

方案1:输出每一条重复记录

$collection->groupBy(function ($item) {
    // 按姓名组合作为分组键
    return $item['first_name'] . $item['last_name'];
})->filter(function ($items) {
    // 只保留元素数量大于1的分组(即存在重复的组)
    return $items->count() > 1;
})->each(function ($duplicateItems) {
    // 遍历组内的每一条重复记录并输出
    $duplicateItems->each(function ($item) {
        console_log("重复记录:{$item['first_name']} {$item['last_name']}");
    });
});

方案2:简化链式写法(PHP 7.4+支持箭头函数)

$collection->groupBy(fn($item) => $item['first_name'] . $item['last_name'])
           ->filter(fn($items) => $items->count() > 1)
           ->each(fn($duplicates) => $duplicates->each(fn($item) => console_log("重复项:{$item['first_name']} {$item['last_name']}")));

方案3:仅输出重复的姓名组合(不重复输出每条记录)

如果只需要提示哪些姓名组合重复,不需要每条记录都输出,可以这么写:

$collection->groupBy(fn($item) => $item['first_name'] . $item['last_name'])
           ->filter(fn($items) => $items->count() > 1)
           ->each(function ($items, $nameKey) {
               $fullName = str_replace('', ' ', $nameKey);
               console_log("姓名「{$fullName}」重复,共出现{$items->count()}次");
           });

原理说明

  • groupBy():将集合按「first_name+last_name」的组合分组,相同组合的元素会被归到同一组
  • filter():筛选出元素数量大于1的分组,这些就是存在重复数据的分组
  • each():遍历筛选后的分组,输出对应的重复信息

内容的提问来源于stack exchange,提问作者chdonncha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 09:01:30