当前位置:首页 > PHP教程 > php日期 > 列表

如何用 explode 解析带日期的字符串并按月计算算术平均值

发布:smiling 来源: PHP粉丝网  添加日期:2026-04-16 19:33:15 浏览: 评论:0 

本文详解如何将形如“dd.mm.yyyy|xx,xxx”的空格分隔字符串解析为结构化数据,并基于月份分组计算各月数值的算术平均值,全程使用 php 原生函数(explode、array_map、array_reduce 等)实现高效、可读性强的批量处理。

在实际数据处理中,常遇到以空格分隔、每项含日期与数值(如 04.01.2021|26,140)的字符串。目标是按年月维度(如 01.2021)聚合所有对应数值,并计算其算术平均值。关键在于:正确拆分、精准提取月份标识、清洗数值格式、分组归集、高效求均值。以下为完整、健壮的实现方案:

✅ 步骤分解与代码实现:

  1. $input = '04.01.2021|26,140 05.01.2021|26,225 06.01.2021|26,145 07.01.2021|26,145 08.01.2021|26,165 11.02.2021|26,240 12.02.2021|26,190'
  2.  
  3. // Step 1: 将字符串按空格切分为条目 → 每条再按 '|' 拆为 [date, value] 数组 
  4. $entries = array_map
  5.     fn($item) => explode('|', trim($item)), 
  6.     explode(' '$input
  7. ); 
  8.  
  9. // Step 2: 按 "MM.YYYY" 分组归集数值(去除千位逗号,转为浮点数/整数) 
  10. $groupedByMonth = array_reduce
  11.     $entries
  12.     function ($carry$item) { 
  13.         [$date$valueStr] = $item
  14.         // 提取 MM.YYYY(跳过前3字符即 DD.,取后6位:01.2021) 
  15.         $monthKey = substr($date, 3, 6); 
  16.         // 清洗数值:移除逗号,转换为数字(保留小数精度建议用 floatval) 
  17.         $cleanValue = floatval(str_replace(','''$valueStr)); 
  18.         $carry[$monthKey][] = $cleanValue
  19.         return $carry
  20.     }, 
  21.     [] 
  22. ); 
  23.  
  24. // Step 3: 对每个分组计算算术平均值(自动处理空数组防御) 
  25. $averagesPerMonth = array_map
  26.     fn($values) => count($values) > 0 ? round(array_sum($values) / count($values), 3) : 0.0, 
  27.     $groupedByMonth 
  28. ); 
  29.  
  30. print_r($averagesPerMonth); 

输出示例:

  1. Array 
  2.     [01.2021] => 26164 
  3.     [02.2021] => 26215 

关键注意事项

日期提取鲁棒性:substr($date, 3, 6) 假设日期严格为 DD.MM.YYYY 格式(8位)。若存在 D.M.YYYY 或 YYYY-MM-DD 等变体,应改用 DateTime::createFromFormat() 或正则(如 preg_match('/\d{2}\.(\d{2}\.\d{4})/', $date, $m))确保准确性。

数值精度处理:str_replace(',', '', $valueStr) 仅处理千位逗号;若数据含小数点(如 26,140.50),需额外注意——PHP 中 , 是千分位,. 是小数点。本例中 26,140 实为整数,故直接移除逗号即可。若存在真实小数(如 26,140.75),应先替换千位逗号再 floatval()。

空输入防御:array_reduce 初始值设为空数组 [],array_map 中添加 count($values) > 0 判断,避免除零错误。

性能提示:对于超大数据集(万级条目),可考虑使用 foreach 替代嵌套高阶函数,提升可读性与调试便利性;但对常规业务量(<5000 条),当前函数式写法简洁且性能足够。

总结:

该方案以 explode 为起点,通过 array_map 实现逐项解析,利用 array_reduce 完成智能分组,最终以 array_map + array_sum/count 完成均值计算。三步逻辑清晰、无外部依赖、符合 PSR-12 规范,可直接集成至数据清洗脚本或 ETL 流程中。掌握此模式,即可轻松扩展至按季度、年份、自定义标签等多维度聚合分析。

Tags: explode解析日期字符串 explode计算平均值

分享到: