修改PHP循环数组:从单记录统计转为部门5天汇总
处理Excel多工作表:将部门5天数据作为记录组进行汇总
嘿,我完全get到你的需求——把部门5天的记录作为一个整体组来处理,而不是逐个拆分计算,这样确实能让汇总逻辑更清爽,也更高效!我来给你捋捋具体的实现思路和代码示例,用主流的PhpSpreadsheet库来演示(如果你用的是其他Excel处理库,逻辑也是通用的)。
第一步:组织记录组数据
首先,你需要把部门的5天数据整理成以部门为键、对应5天记录数组为值的结构。如果数据是从数据库查询的,你可以直接按部门分组查询;如果是平级的原始数据,用PHP手动分组也很简单:
示例:从平级数据生成记录组
// 假设这是你从数据库或其他数据源拿到的平级原始数据 $rawDailyData = [ ['dept_name' => '技术部', 'record_date' => '2024-05-01', 'daily_value' => 120], ['dept_name' => '技术部', 'record_date' => '2024-05-02', 'daily_value' => 150], ['dept_name' => '技术部', 'record_date' => '2024-05-03', 'daily_value' => 130], ['dept_name' => '技术部', 'record_date' => '2024-05-04', 'daily_value' => 160], ['dept_name' => '技术部', 'record_date' => '2024-05-05', 'daily_value' => 140], ['dept_name' => '市场部', 'record_date' => '2024-05-01', 'daily_value' => 90], ['dept_name' => '市场部', 'record_date' => '2024-05-02', 'daily_value' => 100], ['dept_name' => '市场部', 'record_date' => '2024-05-03', 'daily_value' => 110], ['dept_name' => '市场部', 'record_date' => '2024-05-04', 'daily_value' => 95], ['dept_name' => '市场部', 'record_date' => '2024-05-05', 'daily_value' => 105], ]; // 将平级数据按部门分组,生成记录组 $departmentRecordGroups = []; foreach ($rawDailyData as $item) { $deptName = $item['dept_name']; // 把当前部门的5天记录归到同一个数组下 if (!isset($departmentRecordGroups[$deptName])) { $departmentRecordGroups[$deptName] = []; } $departmentRecordGroups[$deptName][] = $item; }
第二步:基于记录组做汇总计算
有了按部门分组的记录组后,你可以直接对每个部门的5天记录做聚合计算(比如总计、日均、最高/最低值等),不需要再逐个ID单独处理:
// 处理部门汇总数据 $departmentSummary = []; foreach ($departmentRecordGroups as $deptName => $dailyRecords) { // 计算5天总计:用array_reduce遍历记录组求和 $totalValue = array_reduce($dailyRecords, function($carry, $record) { return $carry + $record['daily_value']; }, 0); // 可以扩展更多统计维度 $dailyValues = array_column($dailyRecords, 'daily_value'); $avgValue = round($totalValue / count($dailyValues), 2); $maxValue = max($dailyValues); // 整理成最终要写入Excel的结构 $departmentSummary[] = [ '部门名称' => $deptName, '5天总计' => $totalValue, '日均数值' => $avgValue, '单日最高值' => $maxValue ]; }
第三步:写入Excel的第二个工作表
接下来就是把汇总数据写入Excel的第二个工作表,和你第一个工作表的逻辑类似,只是数据源换成了我们刚生成的汇总数组:
use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // 初始化Spreadsheet对象 $spreadsheet = new Spreadsheet(); // --- 第一个工作表(你的原有逻辑,这里简化示例)--- $sheet1 = $spreadsheet->getActiveSheet(); $sheet1->setTitle('用户记录'); // 写入用户ID和计算数值(你的原有代码) // $sheet1->setCellValue('A1', '用户ID'); // ... 省略你的原有代码 // --- 创建并写入第二个工作表 --- $sheet2 = $spreadsheet->createSheet(); $sheet2->setTitle('部门5天统计'); // 写入表头 $sheet2->setCellValue('A1', '部门名称'); $sheet2->setCellValue('B1', '5天总计'); $sheet2->setCellValue('C1', '日均数值'); $sheet2->setCellValue('D1', '单日最高值'); // 写入汇总数据 $currentRow = 2; foreach ($departmentSummary as $summary) { $sheet2->setCellValue('A' . $currentRow, $summary['部门名称']); $sheet2->setCellValue('B' . $currentRow, $summary['5天总计']); $sheet2->setCellValue('C' . $currentRow, $summary['日均数值']); $sheet2->setCellValue('D' . $currentRow, $summary['单日最高值']); $currentRow++; } // 保存Excel文件 $writer = new Xlsx($spreadsheet); $writer->save('员工统计报表.xlsx');
为什么这样做更优?
- 逻辑更清晰:把部门的5天数据作为一个整体处理,避免了零散的循环嵌套,后续维护起来更简单。
- 扩展性强:如果之后需要增加周统计、月统计,只需要调整记录组的时间范围和汇总逻辑,不需要改动数据结构。
- 性能更好:减少了不必要的循环次数,尤其是数据量较大时,这种分组处理的方式效率更高。
内容的提问来源于stack exchange,提问作者Geoff_S
相关产品推荐
相关产品推荐

