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

将数组值转换为多维数组:按年月分组余额的代码问题

按年份和月份分组余额的解决方案

嘿,我懂你要解决的问题——把有序的$queryBalance数组按年份和月份分组整理余额对吧?既然数据本身已经是有序的,那处理起来不用搞复杂的排序,只需要遍历的时候顺着维护分组就行,挺省心的。

先明确输入结构(示例)

假设你的$queryBalance是类似这样的有序数组(字段名可以根据实际调整):

$queryBalance = [
    ['record_date' => '2023-01-15', 'current_balance' => 1000],
    ['record_date' => '2023-01-20', 'current_balance' => 1200],
    ['record_date' => '2023-02-05', 'current_balance' => 900],
    ['record_date' => '2024-03-10', 'current_balance' => 1500],
];

PHP实现方案

核心逻辑是遍历每个元素,提取年份和月份,逐步构建多维分组数组。因为数据有序,如果你需要的是当月最新余额,直接覆盖赋值即可;如果需要当月所有余额记录,就追加到数组里。

$groupedBalances = [];

foreach ($queryBalance as $balanceItem) {
    // 从日期字符串提取年、月(这里根据你的实际日期字段和格式调整)
    $dateObj = DateTime::createFromFormat('Y-m-d', $balanceItem['record_date']);
    $year = $dateObj->format('Y');
    $month = $dateObj->format('m'); // 也可以用'F'获取英文月份名,比如January

    // 初始化年份分组(如果不存在)
    if (!isset($groupedBalances[$year])) {
        $groupedBalances[$year] = [];
    }

    // 方案1:保存当月所有余额记录
    if (!isset($groupedBalances[$year][$month])) {
        $groupedBalances[$year][$month] = [];
    }
    $groupedBalances[$year][$month][] = $balanceItem['current_balance'];

    // 方案2:只保存当月最新余额(因为数据有序,最后一条就是最新的)
    // $groupedBalances[$year][$month] = $balanceItem['current_balance'];
}

// 查看结果
print_r($groupedBalances);

JavaScript实现方案

如果是前端处理,用reduce方法就能轻松搞定,逻辑和PHP一致:

const queryBalance = [
    { recordDate: '2023-01-15', currentBalance: 1000 },
    { recordDate: '2023-01-20', currentBalance: 1200 },
    { recordDate: '2023-02-05', currentBalance: 900 },
    { recordDate: '2024-03-10', currentBalance: 1500 },
];

const groupedBalances = queryBalance.reduce((acc, item) => {
    const [year, month] = item.recordDate.split('-');
    
    if (!acc[year]) {
        acc[year] = {};
    }

    // 方案1:保存当月所有余额
    acc[year][month] = acc[year][month] || [];
    acc[year][month].push(item.currentBalance);

    // 方案2:只保存当月最新余额
    // acc[year][month] = item.currentBalance;

    return acc;
}, {});

console.log(groupedBalances);

关键注意点

  • 因为数据是有序的,所以不需要额外排序,遍历过程中直接维护分组即可,效率很高。
  • 重点要根据你实际的字段名(比如日期字段、余额字段)和日期格式调整提取年月的代码。
  • 如果需要月份显示为中文名称(比如“一月”),只需要修改日期格式化的规则就行(PHP用n配合数组映射,JS可以用Intl.DateTimeFormat)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:44:04