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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:27:02