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

PHP中按日期分组MySQL数据时数组赋值异常问题求助

问题根源

我之前也遇到过类似的数组赋值坑!你的问题出在复用了同一个$payment_methods_array数组,没有在处理每个新日期时重置为初始的全0状态。

看你的代码逻辑:

  1. 先创建了一个全0的$payment_methods_array
  2. 循环查询结果时,直接在这个数组上修改对应支付方式的金额,然后把它赋值给$days[$date]
  3. 当下一个日期(比如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:40:18