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
相关产品推荐
相关产品推荐

