Генерация календаря на php с подсветкой событий


Вот уже не думал, что понадобится делать календарь средствами php, но в одном проекте появилась необходимость. Суть задачи была в прорисовке таблицы с датами на текущей месяц где подсвечиваются даты, на которые намечены определенные события.

Честно сказать, чтобы не сильно изобретать велосипед пробежался по просторам и быстро нашел искомый скрипт. Вот он собственно:

# Последний день месяца
$month = date('m',time()) + 1;
$lastday = date('d',mktime(0, 0, 0, $month, 0, date('Y',time())));
$lastday = $lastday + 1;

# 1. Первая неделя
$num = '0';
for($i = 0; $i < 7; $i++)
{
    # Вычисляем номер дня недели для числа
    $dayofweek = date('w',mktime(0, 0, 0, $month, $day_count, $year));
    # Приводим к числа к формату 1 - понедельник, ..., 6 - суббота
    $dayofweek = $dayofweek - 1;
    if($dayofweek == -1) $dayofweek = 6;
    if($dayofweek == $i)
    {	
	# Если дни недели совпадают,заполняем массив $week числами месяца
	$week[$num][$i] = $day_count;
	$day_count++;
    }else{
	$week[$num][$i] = "";
    }
}

# 2. Последующие недели месяца
while(true)
{
    $num++;
    for($i = 0; $i < 7; $i++)
    {
	$week[$num][$i] = $day_count;
	$day_count++;
	# Если достигли конца месяца - выходим из цикла
	if($day_count > $lastday) $week[$num][$i] = "";
    }

   # Если достигли конца месяца - выходим из цикла
    if($day_count > $lastday) break;
}

На выходе мы получаем массив $week с датами для текущего месяца:

Array
(
    [0] => Array
        (
            [0] => 
            [1] => 
            [2] => 
            [3] => 
            [4] => 1
            [5] => 2
            [6] => 3
        )

    [1] => Array
        (
            [0] => 4
            [1] => 5
            [2] => 6
            [3] => 7
            [4] => 8
            [5] => 9
            [6] => 10
        )

    [2] => Array
        (
            [0] => 11
            [1] => 12
            [2] => 13
            [3] => 14
            [4] => 15
            [5] => 16
            [6] => 17
        )

    [3] => Array
        (
            [0] => 18
            [1] => 19
            [2] => 20
            [3] => 21
            [4] => 22
            [5] => 23
            [6] => 24
        )

    [4] => Array
        (
            [0] => 25
            [1] => 26
            [2] => 27
            [3] => 28
            [4] => 29
            [5] => 30
            [6] => 31
        )

    [5] => Array
        (
            [0] => 
            [1] => 
            [2] => 
            [3] => 
            [4] => 
            [5] => 
            [6] => 
        )

)

Далее нам остается только оформить наши цифры в табличный или иной вид:

# Заголовки
$days = array('ПН','ВТ','СР','ЧТ','ПТ','СБ','ВС');
$out = null;
foreach ($days as $val) $weeks .= "<th>$val</th>";
$out .= "<tr>$weeks</tr>";
# Дни
foreach($week as $key=>$val)
{
    # Неделя
    $weeks = '';
    foreach($val as $day)
    {
        if($day == null)    $weeks .= "<td></td>";
        else{
            # Здесь можно вставить проверку на наличие события в данный день.
            $weeks .= "<td>$day</td>";
        }
    }
    $out .= "<tr>$weeks</tr>";
}

echo "<table>$out</table>";

И вот сам результат:

ПНВТСРЧТПТСБВС
12
3456789
10111213141516
17181920212223
24252627282930
#php

Copyright © 2019