I'm trying to retrieve all of the Mondays and Tuesdays and the last Sunday of every month with Carbon since a specific date in the past. Then I would like to loop through the array of days and create an even for that day. I'm trying to figure out how to do that?
// Get all dates of Mondays, Tuesdays, last Sundays of every Month since the first Monday of January of 2000.
$eventDates = Carbon::parse('first Monday of January 2000');
$i = 0;
while($eventDates->lt(Carbon::now()->subDay(14))) {
$event = factory(Event::class)->create([
'date' => $eventDate,
]);
}
I'm sure there's a more performant way of doing this but I'm not that familiar with Carbon. Here, you'll get 3 arrays, each with each Monday, Tuesdays and last Sundays of each month since 2000. You can then iterate over each DatePeriod
, or merge the intervals to get one big DatePeriod
, to create your events.
<?php
use Carbon\Carbon;
use Carbon\CarbonInterval;
$monday = Carbon::parse('First Monday of January 2000');
$tuesday = Carbon::parse('First Tuesday of January 2000');
$sunday = Carbon::parse('Last Sunday of January 2000');
$now = Carbon::now();
$mondays = new DatePeriod(
$monday,
CarbonInterval::week(),
$now
);
$tuesdays = new DatePeriod(
$tuesday,
CarbonInterval::week(),
$now
);
$sundays = new DatePeriod(
$sunday,
CarbonInterval::week(4),
$now
);
$allDays = [];
foreach ($mondays as $day) {
$allDays[] = $day;
}
foreach ($tuesdays as $day) {
$allDays[] = $day;
}
foreach ($sundays as $day) {
$allDays[] = $day;
}
usort($allDays, function ($a, $b) {
return strtotime($a) - strtotime($b);
});
foreach ($allDays as $day) {
echo $day->format("M D Y-m-d")."<br>";
}