如何生成一个数组,其中包含每 27 天循环一次的开始日期和结束日期列表?

How can I generate an array with a list of start and end dates which loop every 27 days?

例如,我希望生成这样的日期

    $data = [
        ['title'=>'Winter', 'start_date'=>'2018-09-20', 'end_date'=>'2018-09-27'],
        ['title'=>'Spring', 'start_date'=>'2018-09-27', 'end_date'=>'2018-10-04'],
        ['title'=>'Summer', 'start_date'=>'2018-10-04', 'end_date'=>'2018-10-11'],
        ['title'=>'Autumn', 'start_date'=>'2018-10-11', 'end_date'=>'2018-10-17'],
        ['title'=>'Winter', 'start_date'=>'2018-10-17', 'end_date'=>'2018-10-24'],
    ];

然后他们会循环,每个季节的 start_date 与每个季节相隔 27 天,并且每个季节总是以正确的顺序循环 e.g.

冬天

Spring

夏天

秋天

每 7 天发生一次,

我想要做的是创建一个数组,将这些日期预填充 100 次,然后我将每隔 X 天在我的应用程序中调用 CRON 以生成更多天数。

我只是对如何生成包含这些日期的数组感到困惑,我不确定如何开始?

你可以使用这样的东西:

$seasons = ['Winter', 'Spring', 'Summer', 'Autumn'];
$startDate = \Carbon\Carbon::parse('2018-09-20');
$data = [];

for ($i=0; $i<100; ++ $i) {
    $data[] = [
        'title' => $seasons[$i % 4],
        'start_date' => $startDate->toDateString(),
        'end_date' => $startDate->addDays($i % 4 == 3 ? 6 : 7)->toDateString(),
    ];
}

dd($data);

我们在这里使用 % 来循环季节,并且对于所有情况,我们添加 7 天,除了秋天(然后我们添加 6 天,总共 27 天,而不是 28 天)。

结果你会得到:

array:100 [▼
  0 => array:3 [▼
    "title" => "Winter"
    "start_date" => "2018-09-20"
    "end_date" => "2018-09-27"
  ]
  1 => array:3 [▼
    "title" => "Spring"
    "start_date" => "2018-09-27"
    "end_date" => "2018-10-04"
  ]
  2 => array:3 [▼
    "title" => "Summer"
    "start_date" => "2018-10-04"
    "end_date" => "2018-10-11"
  ]
  3 => array:3 [▼
    "title" => "Autumn"
    "start_date" => "2018-10-11"
    "end_date" => "2018-10-17"
  ]
  4 => array:3 [▼
    "title" => "Winter"
    "start_date" => "2018-10-17"
    "end_date" => "2018-10-24"
  ]
  5 => array:3 [▼
    "title" => "Spring"
    "start_date" => "2018-10-24"
    "end_date" => "2018-10-31"
  ]
  6 => array:3 [▼
    "title" => "Summer"
    "start_date" => "2018-10-31"
    "end_date" => "2018-11-07"
  ]
  7 => array:3 [▼
    "title" => "Autumn"
    "start_date" => "2018-11-07"
    "end_date" => "2018-11-13"
  ]
  8 => array:3 [▼
    "title" => "Winter"
    "start_date" => "2018-11-13"
    "end_date" => "2018-11-20"
  ]
  9 => array:3 [▶]
  10 => array:3 [▶]
  ...

您可以使用 strtotime and date 函数和一些基本的循环控制结构。

检查以下 (Rextester Demo):

$counter = 0; // counter to manage loops
$max_counter = 100; // maximum number of entries required

$data = array(); //initialize return array

// seasons with their corresponding days
$seasons = array('Winter' => 7, 
                 'Spring' => 7, 
                 'Summer' => 7, 
                 'Autumn' => 6);

// Initializing first date for the loop begin
$start_date = date('Y-m-d');

while( $counter < $max_counter) {

    foreach ($seasons as $season => $daygap) {

        // determining end date
        $end_date = strtotime("+" . $daygap . " day", strtotime($start_date));
        $end_date = date('Y-m-d', $end_date);

        $data[] = array(
                        'title'      => $season, 
                        'start_date' => $start_date, 
                        'end_date'   => $end_date
                       );

        // setting end_date to start_date for next season
        $start_date = $end_date;

        // increment counter
        $counter++;
    }
}

// check the array
var_dump($data);