如何使用PHP将数组中日期相同的元素分组合并?
嘿,这个需求在PHP开发里挺常见的,我给你两种实用的实现方式,你可以根据自己的习惯和场景来选:
方案一:手动foreach循环分组(直观易调试)
这是最容易理解的方式,逻辑清晰,新手也能快速上手:
// 你的原始数组 $originalArray = [ ['date' => '2018-03-26', 'person' => 120.00, 'color' => 'Black'], ['date' => '2018-03-26', 'person' => 120.00, 'color' => 'Yellow'], ['date' => '2018-03-27', 'person' => 120.00, 'color' => 'Red'], ]; $groupedArray = []; foreach ($originalArray as $item) { // 取出当前元素的日期作为分组键 $date = $item['date']; // 如果该日期还没在分组数组中,先初始化一个空数组 if (!isset($groupedArray[$date])) { $groupedArray[$date] = []; } // 可选:如果你不想子数组里重复保留date字段,可以先删除它 // unset($item['date']); // 将当前元素添加到对应日期的分组里 $groupedArray[$date][] = $item; } // 如果你需要外层是数字索引数组(和你示例的结构一致),执行这一步 $groupedArray = array_values($groupedArray); // 输出结果看看 print_r($groupedArray);
执行后就能得到你想要的结构:外层是数字索引,每个元素是一个以日期为键的数组,里面包含所有该日期下的原始元素。
方案二:用array_reduce函数实现(简洁函数式风格)
如果喜欢更简洁的写法,可以用PHP的array_reduce函数来完成,代码更紧凑:
$originalArray = [ ['date' => '2018-03-26', 'person' => 120.00, 'color' => 'Black'], ['date' => '2018-03-26', 'person' => 120.00, 'color' => 'Yellow'], ['date' => '2018-03-27', 'person' => 120.00, 'color' => 'Red'], ]; $groupedArray = array_reduce($originalArray, function ($carry, $item) { $date = $item['date']; // 直接将元素追加到对应日期的分组中,无需手动初始化(PHP会自动创建数组) $carry[$date][] = $item; return $carry; }, []); // 同样,转成数字索引外层数组 $groupedArray = array_values($groupedArray); print_r($groupedArray);
这个方案的原理是通过array_reduce迭代原始数组,逐步累积出分组后的结果,逻辑和foreach是一样的,只是写法更简洁。
两种方案都能实现你的需求,如果你需要调试或者做更多自定义处理,推荐方案一;如果追求代码简洁,方案二更合适。
内容的提问来源于stack exchange,提问作者user5878353
相关产品推荐
相关产品推荐

