Задать вопрос
@jekahm

Не могу понять логику пользовательской функции, которая формирует календарь?

Доброго времени суток!
В учебнике Котерова есть функция, которая формирует календарь (а именно двумерный массив недель и дней):
function makeCal($year, $month)
{
    // Получаем номер дня недели для 1 числа месяца. Корректируем
    // его, чтобы воскресенье соответствовало числу 7, а не числу 0.
    $wday = JDDayOfWeek(GregorianToJD($month, 1, $year), 0);
	echo $wday."<br />";
    if ($wday == 0)
        $wday = 7;
    // Начинаем с этого числа в месяце (если меньше нуля
    // или больше длины месяца, тогда в календаре будет пропуск).
    $n = -($wday - 2);
    $cal = array();
    // Цикл по строкам.
    for ($y = 0; $y < 6; $y++) {
        // Будущая строка. Вначале пуста.
        $row = array();
        $notEmpty = false;
        // Цикл внутри строки по дням недели.
        for ($x = 0; $x < 7; $x++, $n++) {
            // Текущее число >0 и < длины месяца?
            if (checkdate($month, $n, $year)) {
                // Да. Заполняем клетку.
                $row[] = $n;
                $notEmpty = true;
            } else {
                // Нет. Клетка пуста.
                $row[] = "";
            }
        }
        // Если в данной строке нет ни одного непустого элемента,
        // значит, месяц кончился.
        if (!$notEmpty)
            break;
        // Добавляем строку в массив.
        $cal[] = $row;
    }
    return $cal;
}
$now = getdate();
$cal = makeCal($now['year'], $now['mon']);


Общая суть функции ясна. Но почему здесь $n = -($wday - 2); от дня недели отнимается именно число 2 и еще присваивается минус.
Заранее благодарен за ответ!
  • Вопрос задан
  • 2290 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
пропуск предыдущих дней неполной недели следующего месяца: сдвиг на неделю влево, и, если отрицательное - то пустая клетка.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы