PHP实现数组两次分组求平均值:先5个一组再12个一组
实现多级分组求平均值的PHP循环方案
嘿,我来帮你搞定这个多级分组求平均的需求!咱们分两步走:先把1440个元素按每5个一组算出sin和cos的平均值,得到288个结果;再把这288个结果按每12个一组二次求平均,最终得到24个结果。
首先要注意的是:你生成的$values数组里的元素是字符串格式(比如('2018-01-23 00:01:00', -0.3746..., -0.9271...)),没法直接做数值计算,所以第一步得先把每个元素里的sin和cos值提取出来转成浮点数。
完整实现代码
<?php // 假设这是你已经生成的$values数组 // $values = array(...); // 第一步:解析$values数组,提取出sin和cos的数值 $parsedData = []; foreach ($values as $item) { // 去掉字符串前后的括号 $cleanItem = trim($item, '()'); // 按", "分割成三部分(日期、sin值、cos值) list($dateStr, $sinStr, $cosStr) = explode(', ', $cleanItem); // 将sin和cos字符串转为浮点数,存入新数组 $parsedData[] = [ 'sin' => (float)$sinStr, 'cos' => (float)$cosStr ]; } // 第二步:第一级分组:每5个元素一组,计算平均值(得到288个结果) $firstLevelAverages = []; $groupSizeFirst = 5; $totalFirstGroups = count($parsedData) / $groupSizeFirst; // 1440/5=288 for ($i = 0; $i < $totalFirstGroups; $i++) { // 计算当前分组的起始和结束索引 $startIndex = $i * $groupSizeFirst; // 从解析后的数据中截取当前分组的5个元素 $currentGroup = array_slice($parsedData, $startIndex, $groupSizeFirst); // 初始化当前分组的sin和cos总和 $sumSin = 0; $sumCos = 0; foreach ($currentGroup as $data) { $sumSin += $data['sin']; $sumCos += $data['cos']; } // 计算平均值并加入第一级结果数组 $firstLevelAverages[] = [ 'avg_sin' => $sumSin / $groupSizeFirst, 'avg_cos' => $sumCos / $groupSizeFirst ]; } // 第三步:第二级分组:每12个元素一组,计算平均值(得到24个最终结果) $finalAverages = []; $groupSizeSecond = 12; $totalSecondGroups = count($firstLevelAverages) / $groupSizeSecond; // 288/12=24 for ($j = 0; $j < $totalSecondGroups; $j++) { // 计算当前分组的起始和结束索引 $startIndex = $j * $groupSizeSecond; // 从第一级结果中截取当前分组的12个元素 $currentGroup = array_slice($firstLevelAverages, $startIndex, $groupSizeSecond); // 初始化当前分组的sin和cos总和 $sumSin = 0; $sumCos = 0; foreach ($currentGroup as $data) { $sumSin += $data['avg_sin']; $sumCos += $data['avg_cos']; } // 计算平均值并加入最终结果数组 $finalAverages[] = [ 'final_avg_sin' => $sumSin / $groupSizeSecond, 'final_avg_cos' => $sumCos / $groupSizeSecond ]; } // 输出最终结果(可选) // print_r($finalAverages); ?>
代码说明
- 数据解析:遍历原始的
$values数组,把每个字符串元素拆解成可计算的浮点数,避免直接操作字符串导致的计算错误。 - 第一级分组:使用
for循环控制分组,每次从解析后的数据中截取5个元素,累加sin和cos的值后计算平均值。 - 第二级分组:和第一级逻辑类似,只是分组大小改为12,基于第一级的平均值数组进行二次计算。
这样运行后,$finalAverages数组就会包含你需要的24个最终平均值结果啦!
内容的提问来源于stack exchange,提问作者mansoondreamz
相关产品推荐
相关产品推荐

