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

PHP多维数组按日期合并并根据[i]值统计增减金额问题

按日期统计每日增减金额的PHP代码修正

我有一个包含amount、i、created_at字段的PHP多维数组,需要按日期合并数据,根据i的值统计每日增减金额(i=1对应increase,i=2对应decrease)。但编写的foreach循环得到的结果不符合预期,比如100722日期的increase应为0、decrease应为26.24,需要修正代码。


原数组

Array
(
    [0] => Array
        (
            [amount] => 13.31000000
            [i] => 1
            [created_at] => 2022-10-10 23:21:47
        )

    [1] => Array
        (
            [amount] => 19.00000000
            [i] => 2
            [created_at] => 2022-10-10 23:21:38
        )

    [2] => Array
        (
            [amount] => 17.32000000
            [i] => 2
            [created_at] => 2022-10-09 23:21:47
        )

    [3] => Array
        (
            [amount] => 19.15000000
            [i] => 2
            [created_at] => 2022-10-08 23:21:47
        )

    [4] => Array
        (
            [amount] => 14.68000000
            [i] => 2
            [created_at] => 2022-10-07 23:21:47
        )

    [5] => Array
        (
            [amount] => 18.31000000
            [i] => 2
            [created_at] => 2022-10-06 23:21:47
        )

    [6] => Array
        (
            [amount] => 19.48000000
            [i] => 2
            [created_at] => 2022-10-05 23:21:47
        )

    [7] => Array
        (
            [amount] => 11.20000000
            [i] => 1
            [created_at] => 2022-10-04 23:21:47
        )

    [8] => Array
        (
            [amount] => 12.91000000
            [i] => 2
            [created_at] => 2022-10-03 23:21:47
        )

    [9] => Array
        (
            [amount] => 11.55000000
            [i] => 2
            [created_at] => 2022-10-02 23:21:47
        )

    [10] => Array
        (
            [amount] => 13.64000000
            [i] => 1
            [created_at] => 2022-10-09 23:21:38
        )

    [11] => Array
        (
            [amount] => 18.44000000
            [i] => 1
            [created_at] => 2022-10-08 23:21:38
        )

    [12] => Array
        (
            [amount] => 11.56000000
            [i] => 2
            [created_at] => 2022-10-07 23:21:38
        )

    [13] => Array
        (
            [amount] => 12.13000000
            [i] => 1
            [created_at] => 2022-10-06 23:21:38
        )

    [14] => Array
        (
            [amount] => 13.39000000
            [i] => 1
            [created_at] => 2022-10-05 23:21:38
        )

    [15] => Array
        (
            [amount] => 11.36000000
            [i] => 2
            [created_at] => 2022-10-04 23:21:38
        )

    [16] => Array
        (
            [amount] => 11.82000000
            [i] => 1
            [created_at] => 2022-10-03 23:21:38
        )

    [17] => Array
        (
            [amount] => 14.03000000
            [i] => 1
            [created_at] => 2022-10-02 23:21:38
        )

)

现有错误代码

foreach ($result as $k => $y) {
  $info = "decrease";
  if($y['i']==1){
    $info = "increase";
  }
  $d = date('mdy', strtotime($y['created_at']));
  $newDates[$d] = $d;
  if(isset($res[$d]["increase"])){
    $res[$d]["increase"] += $y['amount'];
  }else{
    $res[$d]["increase"] = 0;
  }
  if(isset($res[$d]["decrease"])){
    $res[$d]["decrease"] += $y['amount'];
  }else{
    $res[$d]["decrease"] = 0;
  }
}

当前错误结果

Array
(
    [101022] => Array
        (
            [increase] => 19
            [decrease] => 19
        )

    [100922] => Array
        (
            [increase] => 13.64
            [decrease] => 13.64
        )

    [100822] => Array
        (
            [increase] => 18.44
            [decrease] => 18.44
        )

    [100722] => Array
        (
            [increase] => 11.56
            [decrease] => 11.56
        )

    [100622] => Array
        (
            [increase] => 12.13
            [decrease] => 12.13
        )

    [100522] => Array
        (
            [increase] => 13.39
            [decrease] => 13.39
        )

    [100422] => Array
        (
            [increase] => 11.36
            [decrease] => 11.36
        )

    [100322] => Array
        (
            [increase] => 11.82
            [decrease] => 11.82
        )

    [100222] => Array
        (
            [increase] => 14.03
            [decrease] => 14.03
        )

)

预期正确结果

Array
(
    [101022] => Array
        (
            [increase] => 13.31
            [decrease] => 19
        )

    [100922] => Array
        (
            [increase] => 13.64
            [decrease] => 17.32
        )

    [100822] => Array
        (
            [increase] => 18.44
            [decrease] => 19.15
        )

    [100722] => Array
        (
            [increase] => 0
            [decrease] => 26.24
        )

    [100622] => Array
        (
            [increase] => 12.13
            [decrease] => 18.31
        )

    [100522] => Array
        (
            [increase] => 13.39
            [decrease] => 19.48
        )

    [100422] => Array
        (
            [increase] => 11.20
            [decrease] => 11.36
        )

    [100322] => Array
        (
            [increase] => 11.82
            [decrease] => 12.91
        )

    [100222] => Array
        (
            [increase] => 14.03
            [decrease] => 11.55
        )

)

问题分析与修正代码

原代码的核心问题是:每次循环都会同时修改increase和decrease的值,不管当前记录是增还是减,导致两个字段都被加上了同一个金额。正确逻辑应该是仅对当前记录对应的类型进行累加,同时确保每个日期的初始值为0。

修正后的代码

$res = [];
foreach ($result as $y) {
    $d = date('mdy', strtotime($y['created_at']));
    // 初始化当前日期的增减金额为0(未存在时)
    if (!isset($res[$d])) {
        $res[$d] = [
            'increase' => 0,
            'decrease' => 0
        ];
    }
    // 根据i的值定向累加对应金额
    if ($y['i'] == 1) {
        $res[$d]['increase'] += (float)$y['amount'];
    } elseif ($y['i'] == 2) {
        $res[$d]['decrease'] += (float)$y['amount'];
    }
}

修正说明

  1. 初始化日期数据:处理每条记录前,检查当前日期是否已存在于结果数组,不存在则初始化increase和decrease为0,避免累加时出现未定义值。
  2. 定向累加:仅根据当前记录的i值,对对应的increase或decrease字段进行累加,不会同时修改两个字段。
  3. 类型转换:将字符串格式的amount转换为float类型,保证数值计算的准确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:05:23