如何用 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)聚合所有对应数值,并计算其算术平均值。关键在于:正确拆分、精准提取月份标识、清洗数值格式、分组归集、高效求均值。以下为完整、健壮的实现方案:
✅ 步骤分解与代码实现:
- $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';
- // Step 1: 将字符串按空格切分为条目 → 每条再按 '|' 拆为 [date, value] 数组
- $entries = array_map(
- fn($item) => explode('|', trim($item)),
- explode(' ', $input)
- );
- // Step 2: 按 "MM.YYYY" 分组归集数值(去除千位逗号,转为浮点数/整数)
- $groupedByMonth = array_reduce(
- $entries,
- function ($carry, $item) {
- [$date, $valueStr] = $item;
- // 提取 MM.YYYY(跳过前3字符即 DD.,取后6位:01.2021)
- $monthKey = substr($date, 3, 6);
- // 清洗数值:移除逗号,转换为数字(保留小数精度建议用 floatval)
- $cleanValue = floatval(str_replace(',', '', $valueStr));
- $carry[$monthKey][] = $cleanValue;
- return $carry;
- },
- []
- );
- // Step 3: 对每个分组计算算术平均值(自动处理空数组防御)
- $averagesPerMonth = array_map(
- fn($values) => count($values) > 0 ? round(array_sum($values) / count($values), 3) : 0.0,
- $groupedByMonth
- );
- print_r($averagesPerMonth);
输出示例:
- Array
- (
- [01.2021] => 26164
- [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计算平均值
- 上一篇:PHP中导致date()函数取得时间错误的原因和解决方案
- 下一篇:最后一页
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)
