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

如何高效按日期分组二维数组并填充语言金额默认值?

高效实现方案

数据预处理:降低查询成本

先把$posts转换成日期为一级键、语言ID为二级键的关联数组,后续查询某日期某语言的金额时,直接通过键名即可获取,无需循环遍历,效率大幅提升:

$postsMap = array_reduce($posts, function ($res, $item) {
    $date = $item['date'];
    $langId = $item['lang_id'];
    if (!isset($res[$date])) {
        $res[$date] = [];
    }
    $res[$date][$langId] = $item['amount'];
    return $res;
}, []);

// 提取所有语言ID的列表,用于后续补全缺失数据
$allLangIds = array_column($langs, 'id');

生成最终分组结果

遍历每个日期分组,结合所有语言ID,将无对应数据的语言金额设为0:

$finalResult = [];
foreach ($postsMap as $date => $dailyLangAmounts) {
    $dailyData = [];
    foreach ($allLangIds as $langId) {
        // 存在数据则取对应金额,否则设为0(PHP7+ 空合并运算符简化写法)
        $dailyData[$langId] = $dailyLangAmounts[$langId] ?? 0;
        
        // 若需要输出语言名称,可先将$langs转为以ID为键的数组:$langs = array_column($langs, null, 'id')
        // 然后生成带名称的结构:
        // $dailyData[] = [
        //     'lang_id' => $langId,
        //     'lang_name' => $langs[$langId]['name'],
        //     'amount' => $dailyLangAmounts[$langId] ?? 0
        // ];
    }
    $finalResult[$date] = $dailyData;
}

效率对比

  • 预处理阶段仅遍历$posts一次,时间复杂度O(n)
  • 传统嵌套循环需要遍历$posts×$langs次,时间复杂度O(nm)*
    数据量越大,两种实现的效率差距越明显。

内容的提问来源于stack exchange,提问作者devie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 01:52:35