Например, я хочу создать даты, подобные этой
$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 дней, чтобы генерировать больше дней.
Я просто запутался, как бы я сгенерировал массив с этими датами, я не уверен, как начать?
Вы можете использовать что-то вроде этого:
$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 а также Дата функции, с некоторыми базовыми структурами управления циклами.
Проверьте следующее (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);