如何高效按日期分组二维数组并填充语言金额默认值?
高效实现方案
数据预处理:降低查询成本
先把$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
相关产品推荐
相关产品推荐

