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

修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:51:12