利用数组分组和归并求和如何实现键重叠二维数组数据的合并?
利用数组分组和归并求和实现键重叠二维数组数据的合并
给定一个带有多维键的关联数组,需要将其按指定分组规则合并,形成新的键重叠数组。具体来说,当指定分组长度为6时,原数组中的键值需按如下规则分组并合并:
- 对于小于6个的键,直接保存在新数组中;
- 对于大于6个的键,将其按6个一组进行分组,并分别合并每个组内的键值(求和),以“开始日期 / 结束日期”的形式存储键值。
解决方案
我们可以利用php中的array_chunk函数将原数组按照指定的长度进行分组,再结合array_reduce函数实现组内数据的求和:
$arr = [ 'categories' => [ '22-01-30', '22-01-31', '22-02-01', '22-02-02', '22-02-03', '22-02-04', '22-02-05', '22-02-06', '22-02-07', '22-02-08', '22-02-09', '22-02-10', '22-02-11', '22-02-12', '22-02-13', '22-02-14', '22-02-15', '22-02-16', '22-02-17', '22-02-18', '22-02-19', '22-02-20', '22-02-21', '22-02-22', '22-02-23', '22-02-24', '22-02-25', '22-02-26', '22-02-27', '22-02-28', ], 'data' => [ '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '5638.04', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '25915.99', '1606.44', '1676.90', '0.00', '0.00', '1203.08', ], ]; $chunk = 6; $result = array_reduce(array_chunk($arr['categories'], $chunk), function ($result, $current) use ($chunk, $arr) { $start = current($current); $end = end($current); $result['categories'][] = $start . '/' . $end; $count = count($result['categories'] ?? []); $result['data'][] = array_sum(array_slice($arr['data'] ?? [], $count * $chunk, $chunk)); return $result; }, ['categories' => [], 'data' => []]); var_dump($result, array_sum($arr['data']) === array_sum($result['data']));
在上述代码中:
- array_chunk函数将$arr['categories']数组按6个为一组进行分组,返回一个二维数组。
-
array_reduce函数对分组后的数组进行遍历,并按如下规则执行:
- 获取每一组的第一个元素作为开始日期,最后一个元素作为结束日期,拼接为“开始日期/结束日期”的格式,保存到$result['categories']中。
- 计算当前组在$arr['categories']中的位置,用$count变量表示。
- 从$arr['data']中截取从$count * $chunk开始的$chunk个元素,将其求和并保存到$result['data']中。
- var_dump函数同时打印合并后的$result数组和原始$arr数据之和是否相等,以验证数据的正确性。
以上就是利用数组分组和归并求和如何实现键重叠二维数组数据的合并?的详细内容,更多请关注其它相关文章!