如何生成一个数组,其中包含每 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);
例如,我希望生成这样的日期
$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);