PHP中按日期分组MySQL数据时数组赋值异常问题求助
问题根源
我之前也遇到过类似的数组赋值坑!你的问题出在复用了同一个$payment_methods_array数组,没有在处理每个新日期时重置为初始的全0状态。
看你的代码逻辑:
- 先创建了一个全0的
$payment_methods_array - 循环查询结果时,直接在这个数组上修改对应支付方式的金额,然后把它赋值给
$days[$date] - 当下一个日期(比如2019-05-06)处理时,这个数组还保留着上一个日期修改后的数值(比如Stripe的70),你只更新了Paypal的金额,其他未涉及的支付方式就带着旧值被存入了新日期的数组里。
两种解决办法
针对这个问题,有两种简单有效的修复方式:
方法1:用模板数组复制(推荐)
先把初始的全0数组保存为一个模板,每次处理新日期时,复制这个模板得到干净的全0数组,再修改当前日期的支付金额:
// 先保存一个全0的模板数组 $payment_methods_template = []; foreach($paymentmethods as $methods){ $payment_methods_template[$methods['value']] = 0; } $days = []; foreach($query as $day){ // 每次循环都复制模板,得到全新的全0数组 $current_payments = $payment_methods_template; $key = $day['value']; $date = $day['date']; $total = $day['total']; // 只修改当前日期对应的支付方式金额 $current_payments[$key] = $total; $days[$date] = $current_payments; }
方法2:每次循环重新生成全0数组
如果不想额外保存模板,也可以在每次循环时重新构建全0数组(不过这种方式需要重复遍历$paymentmethods,效率略低,适合数据量小的场景):
$days = []; foreach($query as $day){ // 每次循环都重新创建全0的支付方式数组 $payment_methods_array = []; foreach($paymentmethods as $methods){ $payment_methods_array[$methods['value']] = 0; } $key = $day['value']; $date = $day['date']; $total = $day['total']; $payment_methods_array[$key] = $total; $days[$date] = $payment_methods_array; }
修复后的预期结果
修改后,$days数组的2019-05-06子数组里,Stripe的金额就会正确显示为0,符合你的需求:
Array( [2019-05-02] => Array ( [Wire transfer 30 days] => 0 [Stripe] => 70 [Wire transfer 30-60days] => 0 [Paypal] => 56 [Rc Banc] => 0 [Credit card] => 0 [Cash on Delivery] => 0 ) [2019-05-06] => Array ( [Wire transfer 30 days] => 0 [Stripe] => 0 [Wire transfer 30-60days] => 0 [Paypal] => 60 [Rc Banc] => 0 [Credit card] => 0 [Cash on Delivery] => 0 ) )
内容的提问来源于stack exchange,提问作者techline
相关产品推荐
相关产品推荐

