PHP如何根据另一个数组中的文本重复项计算数组值的平均值
PHP如何根据另一个数组中的文本重复项计算数组值的平均值
嘿,我来帮你搞定这个问题!你之前的代码逻辑出在每次循环都错误地用整个结果数组的长度来做除法,而不是对应日期的实际出现次数,所以得到了错误的平均值。咱们换个思路,先分别统计每个日期的数值总和和出现次数,最后再用总和除以次数得到正确的平均值,这样就没问题啦。
正确的实现代码
第一种方式,用两个临时数组分别存总和和计数:
$dateclosed = array("28-09-2024", "30-09-2024", "30-09-2024", "30-09-2024", "16-09-2024"); $medpo = array(23.83, 17.27, 40.55, 34.11, 24.94); // 初始化临时数组:分别存储每个日期的数值总和、出现次数 $sumByDate = []; $countByDate = []; // 遍历原数组,累加对应日期的总和与计数 foreach ($dateclosed as $index => $date) { $currentValue = $medpo[$index]; if (isset($sumByDate[$date])) { $sumByDate[$date] += $currentValue; $countByDate[$date] += 1; } else { $sumByDate[$date] = $currentValue; $countByDate[$date] = 1; } } // 生成你需要的结果数组 $resultDates = array_keys($sumByDate); $resultMedpo = []; foreach ($sumByDate as $date => $total) { $resultMedpo[] = $total / $countByDate[$date]; } // 输出验证 print_r($resultDates); print_r($resultMedpo);
代码解释
- 遍历统计阶段:我们逐个对应
$dateclosed和$medpo的元素,对每个日期:- 如果是第一次遇到,就初始化它的总和为当前数值,计数为1
- 如果已经存在,就把当前数值加到总和里,计数加1
- 计算平均值阶段:遍历统计好的总和数组,用每个日期的总和除以它的出现次数,得到精确的平均值。
运行这段代码后,你会得到完全符合预期的结果:
$resultDates=["28-09-2024", "30-09-2024", "16-09-2024"]$resultMedpo=[23.83, 30.64333333333333, 24.94]
更简洁的写法(单临时数组)
如果你想更紧凑,可以用一个关联数组同时存储每个日期的总和和计数:
$dateclosed = array("28-09-2024", "30-09-2024", "30-09-2024", "30-09-2024", "16-09-2024"); $medpo = array(23.83, 17.27, 40.55, 34.11, 24.94); $temp = []; foreach ($dateclosed as $i => $date) { // 初始化当前日期的统计数据(如果不存在) if (!isset($temp[$date])) { $temp[$date] = ['sum' => 0, 'count' => 0]; } $temp[$date]['sum'] += $medpo[$i]; $temp[$date]['count']++; } // 生成结果 $resultDates = []; $resultMedpo = []; foreach ($temp as $date => $data) { $resultDates[] = $date; $resultMedpo[] = $data['sum'] / $data['count']; } print_r($resultDates); print_r($resultMedpo);
这个写法逻辑和上面完全一致,只是用一个数组封装了每个日期的统计信息,可读性也很好。
为什么你之前的代码不对?
你之前的代码里,每次循环都执行:
$new_array_calc[$value] = $new_array_calc[$value] / count($new_array_calc);
这里的count($new_array_calc)是整个结果数组的元素个数,而不是当前日期的出现次数。比如当你处理第二个"30-09-2024"时,结果数组只有2个元素("28-09-2024"和"30-09-2024"),你就把总和除以2,这显然不符合需求——咱们需要先把同日期的所有数值全部加完,最后再除以该日期的总出现次数,而不是每次加完就除。
备注:内容来源于stack exchange,提问作者jokalalilo
相关产品推荐
相关产品推荐

