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

计算字符串中按月份分组的数值算术平均值

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

本文详解如何将形如“dd.mm.yyyy|xx,xxx”的日期-数值对字符串解析、按月归组,并高效计算各月数值的算术平均值,全程使用 php 原生函数链式处理,兼顾可读性与实用性。

在实际数据处理中,常遇到以空格分隔、含日期与带千位分隔符数值的扁平化字符串(如日度行情或日志指标)。本教程以典型场景为例:输入字符串包含多条 DD.MM.YYYY|XX,XXX 格式记录,目标是按年月(MM.YYYY)聚合所有数值,并精确计算每月算术平均值。

核心思路分为三步:拆分 → 归组 → 聚合。以下为完整、健壮且可直接运行的 PHP 实现:

  1. <?php 
  2. $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'
  3.  
  4. // 步骤1:将字符串按空格切分为记录,再对每条记录用 '|' 拆分为 [date, value] 数组 
  5. $records = array_map
  6.     fn($item) => explode('|', trim($item)), 
  7.     explode(' '$input
  8. ); 
  9.  
  10. // 步骤2:按 "MM.YYYY" 归组数值(提取日期第3–9位,即 "01.2021";移除数值中的逗号并转为数字) 
  11. $groupedByMonth = array_reduce
  12.     $records
  13.     function ($carry$record) { 
  14.         if (count($record) !== 2) return $carry// 安全校验:跳过格式异常项 
  15.         [$date$valueStr] = $record
  16.         $monthKey = substr($date, 3, 7); // 提取 "MM.YYYY"(从索引3开始共7字符:"01.2021") 
  17.         $cleanValue = (float) str_replace(','''$valueStr); 
  18.         $carry[$monthKey][] = $cleanValue
  19.         return $carry
  20.     }, 
  21.     [] 
  22. ); 
  23.  
  24. // 步骤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); 
  31. // 输出示例: 
  32. // Array 
  33. // ( 
  34. //     [01.2021] => 26164 
  35. //     [02.2021] => 26215 
  36. // ) 

✅ 关键说明与最佳实践:

日期提取鲁棒性:使用 substr($date, 3, 7) 精准截取 MM.YYYY(固定长度格式),比正则更轻量;若需支持 YYYY-MM-DD 等变体,建议改用 DateTime::createFromFormat() 解析后格式化。

数值清洗安全:str_replace(',', '', $valueStr) 清除千位分隔符,(float) 强制类型转换确保参与计算;对含小数点的数值(如 26,140.5)需额外处理(例如先替换 , 为 . 再转换)。

错误防御:代码中已加入 count($record) !== 2 校验,避免因空格冗余或格式错误导致崩溃;生产环境建议补充 is_numeric($cleanValue) 验证。

精度控制:round(..., 3) 保留三位小数,可根据业务需求调整(如金融场景常用 bcdiv() 保证高精度)。

该方案无需循环嵌套,全部基于函数式编程范式(array_map/array_reduce),逻辑清晰、扩展性强——如需改为按季度统计,仅需修改 $monthKey 的生成逻辑即可。

Tags: php计算字符串 php月份分组

分享到: