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']; } }
修正说明
- 初始化日期数据:处理每条记录前,检查当前日期是否已存在于结果数组,不存在则初始化
increase和decrease为0,避免累加时出现未定义值。 - 定向累加:仅根据当前记录的
i值,对对应的increase或decrease字段进行累加,不会同时修改两个字段。 - 类型转换:将字符串格式的
amount转换为float类型,保证数值计算的准确性。
内容的提问来源于stack exchange,提问作者Cloud Mining
相关产品推荐
相关产品推荐

