You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:20:40