Retrieving All Days Specific in A Month
Asked Answered
A

2

5

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,
    ]);
}
Amazon answered 21/8, 2017 at 17:23 Comment(0)
B
4

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>";
}
Backstage answered 21/8, 2017 at 17:45 Comment(3)
I've tried using the collection method merge and for some reason, it isn't merging. I was going to try and merge all into one main array and then sort by the date.Amazon
I've edited the post. It's even uglier than before, but it's sorting them all into one array now.Backstage
@Backstage Checkout my answer. That is probably how one should go about doing this.Antichrist
A
2

You can use Carbon's filter() and isWeekday() method to a date period:

$period = CarbonPeriod::between('2020-03-01', '2020-03-31')->filter('isWeekday');
foreach ($period as $date) {
  $days[] = $date->format('Y-m-d');
}
echo implode('<br>', $days);

This will print out

2020-03-02
2020-03-03
2020-03-04
2020-03-05
2020-03-06
2020-03-09
2020-03-10
2020-03-11
2020-03-12
2020-03-13
2020-03-16
2020-03-17
2020-03-18
2020-03-19
2020-03-20
2020-03-23
2020-03-24
2020-03-25
2020-03-26
2020-03-27
2020-03-30
2020-03-31

https://carbon.nesbot.com/docs/#api-period

Antichrist answered 12/3, 2020 at 10:19 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.