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
相关产品推荐
相关产品推荐

