PHP中如何从数据库返回的多组数组计算对应位置元素平均值
问题描述
从数据库获取到的原始数据格式如下:
array(4) { [0]=> array(1) { ["rate"]=> string(20) "["1.55","1","1","1"]" } [1]=> array(1) { ["rate"]=> string(29) "["2.55","2.55","2.55","2.55"]" } [2]=> array(1) { ["rate"]=> string(17) "["1","1","1","1"]" } [3]=> array(1) { ["rate"]=> string(29) "["1.2","1.21","1.2","1.2"]" } }
需要计算每个对应位置元素的平均值:
- 第1位:
(1.55+2.55+1+1.2)/4 = 1.57 - 第2位:
(1+2.55+1+1.21)/4 = 1.44 - 第3位:
(1+2.55+1+1.2)/4 = 1.43 - 第4位:
(1+2.55+1+1.2)/4 = 1.43
最终期望结果:
["1.57","1.44","1.43","1.43"]
当前尝试的代码:
foreach($dibor_data as $key=>$value){ if(array_key_exists($key,$sum)){ $repeat[$key] = $repeat[$key]+1; $sum[$key] = $sum[$key] + json_decode($value['rate']); } }
解决方案
你的现有代码问题在于直接对数组做加法运算,PHP无法直接通过+实现数组元素的逐位累加,需要按位置逐个处理。以下是完整实现方案:
步骤说明
- 初始化求和数组:以第一条数据的数组长度为基准,创建全0数组存储各位置总和
- 遍历原始数据:将每条的
rate字符串转成数组,逐位累加到求和数组中 - 计算平均值:将求和数组的每个元素除以数据总条数,保留两位小数
- 转成目标JSON格式输出
完整代码示例
// 假设$dibor_data是数据库返回的原始数组 $dibor_data = [ ["rate" => '["1.55","1","1","1"]'], ["rate" => '["2.55","2.55","2.55","2.55"]'], ["rate" => '["1","1","1","1"]'], ["rate" => '["1.2","1.21","1.2","1.2"]'], ]; // 初始化求和数组,基于第一条数据的长度创建全0数组 $firstRate = json_decode($dibor_data[0]['rate'], true); $sum = array_fill(0, count($firstRate), 0); $totalCount = count($dibor_data); // 遍历每条数据,逐位累加数值 foreach ($dibor_data as $item) { $rateArray = json_decode($item['rate'], true); foreach ($rateArray as $index => $value) { $sum[$index] += (float)$value; } } // 计算平均值并保留两位小数 $average = array_map(function($total) use ($totalCount) { return number_format($total / $totalCount, 2); }, $sum); // 输出目标JSON格式结果 $result = json_encode($average); echo $result; // 输出:["1.57","1.44","1.43","1.43"]
关键细节说明
json_decode传入第二个参数true,将JSON字符串转为索引数组,方便遍历操作- 用
(float)$value将字符串转为浮点数,避免字符串拼接错误 number_format确保结果保留两位小数,与期望输出格式一致- 若数据库返回的
rate数组长度不一致,可添加长度判断逻辑(如取最短长度或补0),本示例默认所有数组长度相同
内容的提问来源于stack exchange,提问作者Firefog
相关产品推荐
相关产品推荐

