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

PHP中foreach嵌套for循环使用DateTime对象仅执行一次的问题

问题原因

这是因为PHP的对象赋值默认是引用传递,而非值拷贝:

  • 你在foreach外部初始化$begin后,它是一个独立的DateTime实例
  • 第一次进入foreach循环时,执行$i = $begin不会生成新的DateTime对象,只是让$i和$begin指向同一个内存地址的实例
  • 后续for循环中调用$i->modify('+1 day'),本质是修改两个变量共同指向的这个DateTime对象的值,等第一次for循环执行完毕,这个实例的日期已经被修改为和$end一致甚至更大
  • 下一轮foreach迭代时,$i = $begin拿到的还是这个已经被修改到年末的日期,自然不满足$i <= $end的判断条件,for循环就不会执行了

其他可选解决方案

除了你现在把DateTime初始化放到foreach内部的写法外,也可以用clone关键字在for循环初始化时做对象拷贝,避免修改原始的$begin实例,同样可以正常运行:

$eindejaar = date('Y-m-d', strtotime("last day of last year"));
$beginjaar = date('Y-m-d',strtotime("first day of last year"));
$begin = new DateTime( $beginjaar);
$end   = new DateTime( $eindejaar );

foreach($array AS $installatie)
{
    // 用clone拷贝新的对象,修改不会影响原$begin
    for($i = clone $begin; $i <= $end; $i->modify('+1 day')){
        // 业务逻辑
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:09:04