| Добрый вечер. Для своего форума, находящегося в разработке, решил сделать календарь. Но столкнулся с проблемой: при выводе календаря на весь год, начиная с мая месяца, числа отображаются некорректно, и повторяются. вот код (календарь делал на основе того, что был в книге "Самоучитель PHP 5 Второе издание"):
<?php
//узнаем нынешний год
$current_year = strftime("%Y");
//инициализация месяцев во время формата UNIX
$time_[1] = mktime(0,0,0, 1,1,$current_year);
$time_[2] = mktime(0,0,0, 2,1,$current_year);
$time_[3] = mktime(0,0,0, 3,1,$current_year);
$time_[4] = mktime(0,0,0, 4,1,$current_year);
$time_[5] = mktime(0,0,0, 5,1,$current_year);
$time_[6] = mktime(0,0,0, 6,1,$current_year);
$time_[7] = mktime(0,0,0, 7,1,$current_year);
$time_[8] = mktime(0,0,0, 8,1,$current_year);
$time_[9] = mktime(0,0,0, 9,1,$current_year);
$time_[10] = mktime(0,0,0, 10,1,$current_year);
$time_[11] = mktime(0,0,0, 11,1,$current_year);
$time_[12] = mktime(0,0,0, 12,1,$current_year);
sort ($time_);
$calendar = "";
$counter = 0;
/////////////////////////////////////////////////////
//###################################################
foreach ($time_ as $value)
{
// Вычисляем число дней в текущем месяце
$dayofmonth = date('t', $value);
// Счётчик для дней месяца
$day_count = 1;
//месяц
$is_month = strftime ("%m", $value);
$now_month = strftime("%m");
//год
$year = strftime("%Y");
//day
$day = strftime("%d", time());
// 1. Первая неделя
$num = 0;
for($i = 0; $i < 7; $i++)
{
// Вычисляем номер дня недели для числа
$dayofweek = date('w', mktime(0, 0, 0, strftime("%m", $value), $day_count, strftime('%Y')));
// Приводим к числа к формату 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 > $dayofmonth) break;
}
// Если достигли конца месяца - выходим
// из цикла
if($day_count > $dayofmonth) break;
}
// 3. Выводим содержимое массива $week
// в виде календаря
// Выводим таблицу
$cur_month = strftime("%B %Y", $value);
$do = "<table class='calendar' align='center' width='20%'>\n";
$do .= "<tr><td class='calendar_head' colspan='8' align='center'>
<a class='c_m_name'>".$cur_month."</a>
</td></tr>";
$do .= "
<td class='calendar_head'>Пн</td>
<td class='calendar_head'>Вт</td>
<td class='calendar_head'>Ср</td>
<td class='calendar_head'>Чт</td>
<td class='calendar_head'>Пт</td>
<td class='calendar_head'>Сб</td>
<td class='calendar_head'>Вс</td>
";
for($i = 0; $i < count($week); $i++)
{
$do .= "<tr class='f_block'>\n";
for($j = 0; $j < 7; $j++)
{
if(!empty($week[$i][$j]))
{
// Если имеем дело с субботой и воскресенья
// подсвечиваем их
if($j == 5 || $j == 6)
{
if ($week[$i][$j] == $day && $is_month == $now_month)
{
$do .= "<td class='c_td_today'><a class='c_weekend' href='calendar.php?year=$year&month=$is_month&day=".$week[$i][$j]."'>".$week[$i][$j]."</a></td>\n";
}
else
{
$do .= "<td class='c_td'><a class='c_weekend' href='calendar.php?year=$year&month=$is_month&day=".$week[$i][$j]."'>".$week[$i][$j]."</a></td>\n";
}
}
else
{
if ($week[$i][$j] == $day && $is_month == $now_month)
{
$do .= "<td class='c_td_today'><a class='c_week' href='calendar.php?year=$year&month=$is_month&day=".$week[$i][$j]."'>".$week[$i][$j]."</a></td>\n";
}
else
{
$do .= "<td class='c_td'><a class='c_week' href='calendar.php?year=$year&month=$is_month&day=".$week[$i][$j]."'>".$week[$i][$j]."</a></td>\n";
}
}
}
else $do .= "<td> </td>\n";
}
$do .= "</tr>\n";
}
$do .= "</table>\n";
$calendar .= $do;
}
?>
|
может, кто-либо пытался сделать тоже самое, и сталкивался с подобной проблемой? если что-то неверно в коде - подскажите, пожалуйста, что :) | |