PHP如何按指定键拆分关联数组生成Chart.js适配的日期与收支数据
PHP收支数据拆分补0实现方案
实现逻辑
- 第一步:提取原始数组中所有唯一日期,排序后作为图表标签数组
- 第二步:以日期为键初始化收入、支出映射数组,默认值统一设为0
- 第三步:遍历原始数组,按日期和收支类型累加对应金额
- 第四步:按日期顺序提取映射数组的值,得到最终的收支数据数组
原生PHP实现代码
// 提取去重并排序的日期数组 $dates = array_unique(array_column($movements, 'Dates')); sort($dates); // 初始化收入、支出映射,默认值为0 $incomeMap = array_fill_keys($dates, 0); $expenseMap = array_fill_keys($dates, 0); // 遍历原始数据累加金额 foreach ($movements as $item) { $date = $item['Dates']; $amount = $item['amount']; if ($item['type'] === 'income') { $incomeMap[$date] += $amount; } elseif ($item['type'] === 'expense') { $expenseMap[$date] += $amount; } } // 提取按日期顺序排列的收支数组 $income = array_values($incomeMap); $expense = array_values($expenseMap);
Laravel集合简化实现(可选)
如果你在Laravel环境中使用,可通过集合方法简化代码:
$dates = collect($movements)->pluck('Dates')->unique()->sort()->values()->toArray(); $income = collect($dates)->map(function ($date) use ($movements) { return collect($movements)->where('Dates', $date)->where('type', 'income')->sum('amount'); })->toArray(); $expense = collect($dates)->map(function ($date) use ($movements) { return collect($movements)->where('Dates', $date)->where('type', 'expense')->sum('amount'); })->toArray();
输出验证
最终输出结果完全匹配需求:
$dates为按时间排序的所有唯一日期数组- 收入、支出数组的索引与
$dates完全对应,无数据的位置自动补0 - 同一天存在多条同类型记录时会自动累加金额,兼容实际业务场景
内容的提问来源于stack exchange,提问作者Rayvyn
相关产品推荐
相关产品推荐

