Вот уже не думал, что понадобится делать календарь средствами 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>";
И вот сам результат:
ПН | ВТ | СР | ЧТ | ПТ | СБ | ВС |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |