Как я могу сгенерировать массив со списком дат начала и окончания, которые повторяются каждые 27 дней?

Например, я хочу создать даты, подобные этой

    $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'],
];

И они будут зацикливаться, дата начала каждого сезона составляет 27 дней друг от друга, и каждый сезон всегда зацикливается в правильном порядке, например.

зима

весна

Летом

осень

Это происходит каждые 7 дней,

Я хочу создать массив, который будет заполнять эти даты 100 раз, а затем я буду вызывать CRON в моем приложении каждые X дней, чтобы генерировать больше дней.

Я просто запутался, как бы я сгенерировал массив с этими датами, я не уверен, как начать?

1

Решение

Вы можете использовать что-то вроде этого:

$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 [▶]
...
0

Другие решения

Вы могли бы использовать StrToTime а также Дата функции, с некоторыми базовыми структурами управления циклами.

Проверьте следующее (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);
0

По вопросам рекламы [email protected]