在PHP开发的实际业务场景中,我们经常会遇到需要将格式化的字符串数据拆分后,按照月份维度统计数值算术平均值的需求,比如日志中存储的按月记录的销量数据、用户按月提交的积分数据等,这类数据通常以特定分隔符拼接成字符串存储,需要先用explode拆分再处理。
explode函数基础说明
explode是PHP中用于拆分字符串的内置函数,作用是将一个字符串按照指定的分隔符分割成数组,函数的基本语法如下:
<?php /** * explode函数参数说明 * @param string $separator 分隔符,不能为空字符串 * @param string $string 需要拆分的原始字符串 * @param int $limit 可选参数,限制返回数组的最大元素数量,默认不限制 * @return array 拆分后得到的字符串数组 */ $result = explode($separator, $string, $limit); ?>
数据准备与拆分逻辑
假设我们有一组存储用户月度积分的字符串数据,格式为月份:积分值,多个记录用逗号分隔,原始字符串示例如下:
<?php // 原始字符串,格式为 月份:积分值,月份:积分值 $dataStr = "1:85,1:92,2:78,2:88,3:90,3:95,1:88,2:82"; ?>
首先使用explode按照逗号拆分整个字符串,得到每个独立的月份积分记录:
<?php
// 按照逗号拆分原始字符串,得到每条记录
$recordArr = explode(',', $dataStr);
// 拆分后结果:["1:85","1:92","2:78","2:88","3:90","3:95","1:88","2:82"]
?>
按月份分组汇总数值
拆分得到单条记录后,需要再次使用explode按照冒号拆分每条记录,提取月份和对应的积分值,然后按月份分组存储数值:
<?php
// 初始化月份分组数组
$monthGroup = [];
// 遍历每条记录
foreach ($recordArr as $record) {
// 按照冒号拆分单条记录,得到月份和积分
$item = explode(':', $record);
$month = $item[0];
$score = intval($item[1]);
// 如果月份分组不存在则初始化空数组
if (!isset($monthGroup[$month])) {
$monthGroup[$month] = [];
}
// 将积分值加入对应月份的分组
$monthGroup[$month][] = $score;
}
// 分组后结果:
// [
// "1" => [85,92,88],
// "2" => [78,88,82],
// "3" => [90,95]
// ]
?>
计算各月份算术平均值
算术平均值的计算逻辑是:分组内所有数值的总和除以数值的个数。遍历分组后的数组,依次计算每个月份的平均值即可:
<?php
// 初始化结果数组,存储每个月份的平均分
$monthAvg = [];
// 遍历月份分组
foreach ($monthGroup as $month => $scoreList) {
// 计算总和
$sum = array_sum($scoreList);
// 计算数值个数
$count = count($scoreList);
// 计算算术平均值,保留2位小数
$avg = round($sum / $count, 2);
$monthAvg[$month] = $avg;
}
// 输出结果
foreach ($monthAvg as $month => $avg) {
echo "月份{$month}的积分算术平均值为:{$avg}<br/>";
}
// 输出内容:
// 月份1的积分算术平均值为:88.33
// 月份2的积分算术平均值为:82.67
// 月份3的积分算术平均值为:92.5
?>
完整实现代码
将上述步骤整合后的完整可运行代码如下:
<?php
// 原始数据字符串
$dataStr = "1:85,1:92,2:78,2:88,3:90,3:95,1:88,2:82";
// 第一步:按逗号拆分得到所有记录
$recordArr = explode(',', $dataStr);
// 第二步:按月份分组
$monthGroup = [];
foreach ($recordArr as $record) {
$item = explode(':', $record);
$month = $item[0];
$score = intval($item[1]);
if (!isset($monthGroup[$month])) {
$monthGroup[$month] = [];
}
$monthGroup[$month][] = $score;
}
// 第三步:计算各月份算术平均值
$monthAvg = [];
foreach ($monthGroup as $month => $scoreList) {
$sum = array_sum($scoreList);
$count = count($scoreList);
$avg = round($sum / $count, 2);
$monthAvg[$month] = $avg;
}
// 输出结果
foreach ($monthAvg as $month => $avg) {
echo "月份{$month}的积分算术平均值为:{$avg}<br/>";
}
?>
注意事项
- 使用explode拆分字符串时,分隔符不能为空字符串,否则会触发PHP警告。
- 拆分后得到的数值如果是字符串类型,需要先转换为整数或浮点数再参与计算,避免运算错误。
- 如果原始字符串中存在空记录或者格式错误的记录,需要提前做校验处理,避免后续拆分报错。
- 计算平均值时如果分组内没有数值,需要做除数不为0的判断,防止出现除零错误。