按ID分组二维数组并计算count/hours值的优化实现
通用分组计算优化方案
问题背景
从数据库获取的二维数组数据示例如下:
array(12) { [0]=> array(4) { ["id"]=> string(1) "1" ["count"]=> string(5) "78984" ["month"]=> string(1) "6" ["hours"]=> string(10) "10580.0833" } [1]=> array(4) { ["id"]=> string(1) "2" ["count"]=> string(5) "64174" ["month"]=> string(1) "6" ["hours"]=> string(9) "6866.8333" } [2]=> array(4) { ["id"]=> string(1) "3" ["count"]=> string(5) "31032" ["month"]=> string(1) "6" ["hours"]=> string(9) "3700.9167" } [3]=> array(4) { ["id"]=> string(1) "1" ["count"]=> string(5) "91114" ["month"]=> string(1) "7" ["hours"]=> string(10) "11859.6000" } // ... 更多数据 }
需求是按id分组,每组存储count/hours的计算值,预期输出格式:
array("number of unique ids") { [1]=> array(12) { // 对应id=1的计算结果集合 float() count/hours float() count/hours // ... } [2]=> array(12) { // 对应id=2的计算结果集合 // ... } // ... 其他id分组 }
当前硬编码实现扩展性极差,新增id时必须修改代码(原代码还存在变量名笔误:$data['id_zmiana']应为$record['id']):
$data1 = []; $data2 = []; $data3 = []; foreach($data as $key => $record){ if($record['id'] == 1){ array_push($data1, $record['count']/$record['hours']); }else if($data['id_zmiana'] == 2){ array_push($data2, $record['count']/$record['hours']); }else{ array_push($data3, $record['count']/$record['hours']); } } $raport = array_merge($data1, $data2, $data3);
通用优化方案
采用动态键名分组的方式,无需硬编码id值,自动适配所有新增的id:
实现代码
$groupedData = []; foreach ($data as $record) { // 显式转换字符串为浮点型,避免字符串运算的意外问题 $count = (float)$record['count']; $hours = (float)$record['hours']; $calculatedValue = $count / $hours; // 以id作为分组键名,动态初始化分组并添加计算结果 $id = $record['id']; if (!isset($groupedData[$id])) { $groupedData[$id] = []; } $groupedData[$id][] = $calculatedValue; } // 若需要将分组结果合并为一维数组(和原代码输出结构一致) $raport = []; foreach ($groupedData as $group) { $raport = array_merge($raport, $group); } // 若需要按id顺序重新索引为连续数字键(如从0开始) // $raport = array_values($groupedData);
方案优势
- 扩展性强:新增任意
id值时无需修改代码,自动完成分组 - 代码简洁:避免重复的条件判断,逻辑清晰易维护
- 类型安全:显式转换数值类型,防止字符串除法导致的错误
- 结构清晰:分组后的数组键名直接对应原
id,便于后续业务使用
内容的提问来源于stack exchange,提问作者Gutek
相关产品推荐
相关产品推荐

