【问题标题】:Pull Looped DateTime value to array将 Looped DateTime 值拉到数组中
【发布时间】:2018-01-31 01:00:21
【问题描述】:

我有以下代码,其中 $Clinics 是一个多维对象数组,格式如下:

Array
(
    [0] => Clinics Object
        (
            [PlanID] => 1
            [id] => 1
            [ClinicCode] => X123ABCD1
            [ClinicDesc] => Test Description
            [SchDay] => Monday
            [SchWeek] => 
            [SchWeekBetween] => 1
        )

    [158] => Clinics Object
        (
            [PlanID] => 1
            [id] => 159
            [ClinicCode] => Y234BCDE2
            [ClinicDesc] => Test Description
            [SchDay] => Monday
            [SchWeek] => 
            [SchWeekBetween] => 1
        )
)

我正在使用下面的代码循环遍历每个对象,从每周一次的计划日 (SchDay) 开始,如果 SchDay 是每天,则每天一次。

$StartDate = new DateTimeImmutable("2018-04-01");
$EndDate = new DateTimeImmutable("2019-03-31");
$Output = array();

foreach ($Clinics as $Clinic) {

    // Set First Date of loop period
    if ($Clinic->SchDay == "Daily") {
        $ClinicStartDate = $StartDate->format("d-m-Y");
        $SchCount = "+1 day"; 
    } else {
        $ClinicStartDate = "First ".$Clinic->SchDay." of ".$StartDate->format("F Y");
        $SchCount = "+7 days";
    }

    // Loop through Dates and add to array
    for($i = new DateTime($ClinicStartDate); $i <= $EndDate; $i->modify($SchCount)){

        $Clinic->Date = $i;
        $Output[] = $Clinic;    
    } 
};

print_r($Output);

我遇到的问题是,当我打印数组时,每个诊所迭代的 Date 值都是相同的 - 循环的最后一个日期,并且数组没有按照 for 循环捕获每个 DateTime。我想我理解它为什么这样做,但我不知道如何解决它。

【问题讨论】:

  • 那是因为您将新的日期时间实例化一次,然后对其进行修改。因此,每次您将 Date 分配给 $i 时,您都在分配它的参考。无论它最终在循环结束时是什么,它们都将引用它,因为它们都在引用一个对象。

标签: php arrays datetime


【解决方案1】:

循环只实例化对象一次。然后你在每次迭代中修改对象,然后将它的引用分配给数组。所有的赋值都引用同一个对象。

解决这个问题很容易,但您必须为每个分配实例化一个新的日期时间:

for ($i = new DateTime("2018-05-01"); $i <= $EndDate; $i->modify('+7 days')) {
    $Clinic->Date = new DateTime($i->format("Y-m-d"));
    $Output[] = $Clinic;
}

http://php.net/manual/en/language.oop5.references.php

编辑: 这是一个工作示例。您所要做的就是复制粘贴来查看它的实际效果。

<?php

$StartDate = new DateTimeImmutable("2018-04-01");
$EndDate = new DateTimeImmutable("2019-03-31");
$Output = array();

for ($i = new DateTime("2018-05-01"); $i <= $EndDate; $i->modify('+7 days')) {
    $Output[] = new DateTime($i->format("Y-m-d"));
}

var_dump($Output);

【讨论】:

  • 您好 DataHerder,感谢您的意见。您提供的方法仍然给出重复日期。对于第一个数组,它为整个诊所序列返回 2019-03-25。
  • @Benjamest :-/ 当我 var_dump 我的输出时,我得到所有不同的日期。这里的关键是您必须为每次迭代实例化一个new DateTime() 对象。我将编辑我的帖子,为您提供一个工作示例。您所要做的就是在 for 循环中将代码中的 $i 更改为 new Datetime($i-&gt;format('Y-m-d'))
【解决方案2】:

通过以下方式设法获得所需的输出:

for($i = new DateTime($ClinicStartDate); $i <= $EndDate; $i->modify($SchCount)){

    $Output[$ArrayCount]['PlanID']          = $Clinic->PlanID;
    $Output[$ArrayCount]['id']              = $Clinic->id;
    $Output[$ArrayCount]['ClinicCode']      = $Clinic->ClinicCode;
    $Output[$ArrayCount]['SchDay']          = $Clinic->SchDay;
    $Output[$ArrayCount]['SchWeek']         = $Clinic->SchWeek;
    $Output[$ArrayCount]['SchWeekBetween']  = $Clinic->SchWeekBetween;
    $Output[$ArrayCount]['Date']                = new DateTime($i->format("Y-m-d"));
    $ArrayCount++;  
}

【讨论】:

    猜你喜欢
    • 2021-11-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多