Разбить месяц на периоды

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

$month = CarbonPeriod::create('2024-02-01', '2024-02-29')

Также данные когда пользователь не работал

$notWorking = [
    CarbonPeriod::create('2024-02-02', '2024-02-07'),
    CarbonPeriod::create('2024-02-12', '2024-02-15')
]

Как получить 3 периода, те когда пользователь работал, имея данные когда он не работал

$work1 = ['start' => '2024-02-01', 'finish' => '2024-02-01']; // один день
$work2 = ['start' => '2024-02-08', 'finish' => '2024-02-11'];
$work2 = ['start' => '2024-02-16', 'finish' => '2024-02-29'];

Ответы (1 шт):

Автор решения: teran

Без Carbon желаемый результат достигается достаточно легко

$month = ['2024-02-01', '2024-02-29'];
$notWorking = [
    ['2024-02-02', '2024-02-07'],
    ['2024-02-12', '2024-02-15']
];
[$start, $end] = $month;

$result = [$start];
foreach ($notWorking as [$s, $e]) {
    $result[] = date('Y-m-d', strtotime("{$s} -1 day"));
    $result[] = date("Y-m-d", strtotime("{$e} +1 day"));
}
$result[] = $end;

print_r(array_chunk($result ,2));

Подозреваю, что с Carbon будет еще проще.

→ Ссылка