Как создать календарь для одного месяца с помощью PHP?

Как можно изменить внутренности цикла обхода дней, чтобы сдвинуть вывод на один день вперёд, не меняя условия самого цикла?
  • 10 сентября 2024 г. 18:03
Ответы на вопрос 3
Для создания простого календаря на один месяц с использованием PHP, вы можете использовать следующий код:

```php
<?php
function drawCalendar($month, $year) {
    // Получение первого дня месяца и его количества дней
    $firstDay = new DateTime("$year-$month-01");
    $daysInMonth = $firstDay->format('t');

    // Получение дня недели первого дня месяца
    $startDayOfWeek = $firstDay->format('w'); // w: 0 (воскресенье) - 6 (суббота)

    echo "<table border='1'>";
    echo "<tr>";
    echo "<th>Вс</th><th>Пн</th><th>Вт</th><th>Ср</th><th>Чт</th><th>Пт</th><th>Сб</th>";
    echo "</tr><tr>";

    // Печать пустых ячеек для дней, предшествующих первому дню
    for ($i = 0; $i < $startDayOfWeek; $i++) {
        echo "<td></td>";
    }

    // Печать дней месяца
    for ($day = 1; $day <= $daysInMonth; $day++) {
        echo "<td>$day</td>";

        // Если день - суббота (6), то начинаем новую строку
        if (($day + $startDayOfWeek) % 7 == 0) {
            echo "</tr><tr>";
        }
    }

    // Закрытие последней строки таблицы
    echo "</tr>";
    echo "</table>";
}

// Пример использования функции для текущего месяца
drawCalendar(date('n'), date('Y'));
?>
```

Теперь, чтобы сдвинуть вывод на один день вперёд, вы можете изменить внутренности цикла, не меняя условия самого цикла. Например, можно просто начать цикл с нуля, а не с единицы, и выводить `($day + 1)`:

Измените эту строку в цикле:

```php
for ($day = 1; $day <= $daysInMonth; $day++) {
```

на

```php
for ($day = 0; $day < $daysInMonth; $day++) {
```

И внутри этого цикла поменяйте вывод:

```php
echo "<td>$day</td>";
```

на 

```php
echo "<td>".($day + 1)."</td>";
```

Таким образом, ваш цикл будет выглядеть следующим образом:

```php
for ($day = 0; $day < $daysInMonth; $day++) {
    echo "<td>".($day + 1)."</td>";

    // Проверка, если день - суббота (6), то начинаем новую строку
    if (($day + $startDayOfWeek + 1) % 7 == 0) { // +1 чтобы сдвинуть на один день вперед
        echo "</tr><tr>";
    }
}
```

Этот способ позволит вам сдвинуть вывод календаря на один день вперёд, не изменяя основное условие цикла.
if ($day == 0) 
continue;

Ну или как там пропустить итерацию цикла в пхп...
в цикле, в начале $real_day = $day + 1; 
И далее везде $day заменить на $real_day...
Похожие вопросы