Laravel集合元素筛选:按startDate与code规则选取目标元素
Laravel集合筛选解决方案
需求回顾
- 同
cde且同startDate的元素,保留第一个; - 同
cde但startDate不同的元素,保留日期最新的。
简洁实现方案
利用Laravel集合的groupBy和sortByDesc方法即可完成需求:
$filteredCollection = $originalCollection // 按cde字段分组,将相同cde的元素归为一组 ->groupBy('cde') // 处理每个分组 ->map(function ($group) { // 按startDate倒序排序,最新日期在前;同日期元素保留原集合顺序 return $group->sortByDesc('startDate')->first(); }) // 重置集合键为连续索引 ->values();
代码说明
groupBy('cde'):将集合按cde字段分组,确保我们只处理相同cde下的元素;sortByDesc('startDate'):分组内按startDate倒序排列,最新的日期会排在最前面;对于startDate相同的元素,排序后会保留它们在原集合中的顺序;first():取排序后的第一个元素,既满足“同cde同startDate保留第一个”,也满足“不同startDate保留最新”的要求;values():将分组后的集合键重置为连续的数字索引,得到结构规整的最终集合。
扩展场景(若需保留同cde下不同startDate的所有元素)
如果需求是同cde下不同startDate的元素都保留,但同startDate只留第一个,可使用以下代码:
$filteredCollection = $originalCollection ->groupBy('cde') ->map(function ($group) { return $group ->sortByDesc('startDate') ->groupBy('startDate') ->map(fn($dateGroup) => $dateGroup->first()) ->values(); }) ->flatten(1);
内容的提问来源于stack exchange,提问作者AM12E
相关产品推荐
相关产品推荐

