Итак, это был мой оборот, использующий функцию, используемую для генерации первых дней каждой недели
function getIsoWeeksInYear($year) {
$date = new DateTime;
$date->setISODate($year, 53);
return ($date->format("W") === "53" ? 53 : 52);
}
function getWeeksPerMonth($year) {
$allWeeks = $this->getIsoWeeksInYear($year);
$allFirstDays = [];
for ($i = 0; $i < $allWeeks; $i++) {
$allFirstDays[] = date('m/Y', strtotime($year . "W" . str_pad($i, 2, "0", STR_PAD_LEFT)));
}
$countWeek = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
foreach ($allFirstDays as $firstDay) {
$theMonth = explode('/', $firstDay);
for ($i = 1; $i < 13; $i++) {
if ($theMonth[0] == $i) {
$countWeek[$i - 1]++;
}
}
}
return $countWeek;
}
Итак, идея заключалась в том, чтобы получить целый массив номеров недель и использовать его в цикле для colspans
<?php $span = getWeeksPerMonth($year) ?>
<?php for ($i = 1; $i < 13; $i++): ?>
<th colspan="<?= $span[$i - 1] ?>"><?= strftime('%B', mktime(0, 0, 0, $i)) ?></th>
<?php endfor ?>
А для строки ниже я просто использую то, что уже использовало ранее в своем вопросе
<?php for ($i = 0; $i < getIsoWeeksInYear($year); $i++): ?>
<?php $firstDay = strtotime($year . 'W' . str_pad($week, 2, '0', STR_PAD_LEFT)); ?>
<th><?= date('d/m/Y', $firstDay) ?></th>
<?php endfor ?>
Таким образом, в январе может быть некоторая неделя, включенная в предыдущий год, а в декабре недельная неделя.
Может быть, еще есть что-то, что можно настроить. В любом случае, я опробую другие ответы и думаю, что в качестве ответа я выберу самый простой.
Редактировать
Похоже, мне не нужно было взрывать полученную дату, поскольку я изначально думал, что мне придется использовать год в некоторых условиях для недели, начинающейся с предыдущего года