Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема с календарем :(
 
 автор: Keks   (09.04.2007 в 19:03)   письмо автору
 
 

Добрый вечер. Для своего форума, находящегося в разработке, решил сделать календарь. Но столкнулся с проблемой: при выводе календаря на весь год, начиная с мая месяца, числа отображаются некорректно, и повторяются. вот код (календарь делал на основе того, что был в книге "Самоучитель PHP 5 Второе издание"):

<?php
  
//узнаем нынешний год
  
$current_year strftime("%Y");
  
//инициализация месяцев во время формата UNIX
  
$time_[1] = mktime(0,0,01,1,$current_year);
  
$time_[2] = mktime(0,0,02,1,$current_year);
  
$time_[3] = mktime(0,0,03,1,$current_year);
  
$time_[4] = mktime(0,0,04,1,$current_year);
  
$time_[5] = mktime(0,0,05,1,$current_year);
  
$time_[6] = mktime(0,0,06,1,$current_year);
  
$time_[7] = mktime(0,0,07,1,$current_year);
  
$time_[8] = mktime(0,0,08,1,$current_year);
  
$time_[9] = mktime(0,0,09,1,$current_year);
  
$time_[10] = mktime(0,0,010,1,$current_year);
  
$time_[11] = mktime(0,0,011,1,$current_year);
  
$time_[12] = mktime(0,0,012,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(000strftime("%m"$value), $day_countstrftime('%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 == || $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>&nbsp;</td>\n";
      }
      
$do .= "</tr>\n";
    }
    
$do .= "</table>\n";
    
$calendar .= $do;

  }

?>

может, кто-либо пытался сделать тоже самое, и сталкивался с подобной проблемой? если что-то неверно в коде - подскажите, пожалуйста, что :)

   
 
 автор: Trianon   (09.04.2007 в 21:04)   письмо автору
 
   для: Keks   (09.04.2007 в 19:03)
 

У меня Ваш скрипт выдал пустую страницу....

   
 
 автор: Keks   (09.04.2007 в 21:48)   письмо автору
 
   для: Trianon   (09.04.2007 в 21:04)
 

там еще
echo $calendar;
надо в конце написать :))

   
 
 автор: cheops   (10.04.2007 в 12:59)   письмо автору
 
   для: Keks   (09.04.2007 в 21:48)
 

Когда в цикле используются динамические массивы для хранения временных значений - их следует обнулять в конце цикла
<?php
    
unset ($week);
?>

иначе временные значения уходят на следующую итерацию.

PS Такие объёмные листинги лучше прикреплять в виде файла.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования