За последние 24 часа нас посетили 72705 программистов и 1650 роботов. Сейчас ищут 910 программистов ...

Календарь

Тема в разделе "PHP для новичков", создана пользователем kilogram, 31 май 2012.

  1. kilogram

    kilogram Активный пользователь

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    В книге там прохожу немного даты и такой окд, вроде все верно написал, но он ругается на второй орич в конце кода непонятно почему.

    Код (Text):
    1.  
    2. <?php
    3. //echo '<pre>'.print_r(getdate(),1).'</pre>';
    4. function Calendar($year,$month){
    5. $wday = JDDayofWeek(GregorianToJD($month,1,$year),0);
    6. if($wday == 0) $wday = 7;
    7. $n = - ($wday - 2);
    8. $cal = array();
    9.     for($j = 0; $j < 6; $j++){
    10.         $row = array();
    11.         $notEmpty = false;
    12.         for($x = 0; $x < 7; $x++,$n++){
    13.         if(checkdate($month,$n,$year)){
    14.         $row[] = $n;
    15.         $notEmpty = true;      
    16.             } else{ $row = ''; }
    17.         }
    18.     if(!$notEmpty) break;
    19.     $cal[] = $row;
    20.     }
    21.     return $cal;
    22. }
    23. //Формируем календарь на текущий месяц
    24. $now = getdate();
    25. $cal = Calendar($now['year'],$now['mon']-1);
    26. ?>
    27. <!-- Шаблон вывода календаря -->
    28. <table border="1">
    29.     <tr>
    30.         <td>Пн</td>
    31.         <td>Вт</td>
    32.         <td>Ср</td>
    33.         <td>Чт</td>
    34.         <td>Пт</td>
    35.         <td>Сб</td>
    36.         <td style="color:red">Вс</td>
    37.     </tr>
    38.     <? foreach ($cal as $row) {?>
    39.     <tr>
    40.     <? foreach ($row as $i=>$v){?>
    41.     <td style="<?=$i==6?'color:red':''?>">
    42.         <?=$v? $v : '&nbsp;'?>
    43.     </td>
    44.     <? } ?>
    45.     </tr>
    46.     <? } ?>
    47. </table>

    Код (Text):
    1.  
    2. Warning: Invalid argument supplied for foreach() in C:\www\htdocs\test.ru\www\index.php on line 39
     
  2. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    $cal = Calendar($now['year'],$now['mon']-1);
    print_r($cal);
     
  3. kilogram

    kilogram Активный пользователь

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Я так понял из-за вот этого места может for($j = 0; $j < 6; $j++){
    Если написать там for($j = 0; $j < 5; $j++){ тогда выведет без ошибки, но выведет не все рабочие дни этого месяца.
     
  4. kilogram

    kilogram Активный пользователь

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Вот взял исходник, нашел папку этого календаря и выдает что 1 июня это воскресенье, что за бред? Автор книги ошибся что ли?
    Что может не правильно быть в коде, как-то странно. Вот оригинал автора с книги. Вот на сервер забросил результат http://santa.comoj.com/
    Код (Text):
    1. <?php ## Календарь на текущий месяц.
    2. // Функция формирует двумерный массив, представляющий собой
    3. // календарь на указанный месяц и год. Массив состоит из строк,
    4. // соответствующих неделям. Каждая строка - массив из семи
    5. // элементов, которые равны числам (или пустой строке, если
    6. // данная клетка календаря пуста).
    7. function makeCal($year, $month) {
    8.   // Получаем номер дня недели для 1 числа месяца. Корректируем
    9.   // его, чтобы воскресенье соответствовало числу 7, а не числу 0.
    10.   $wday = JDDayOfWeek(GregorianToJD($month, 1, $year), 0);
    11.   if ($wday == 0) $wday = 7;
    12.   // Начинаем с этого числа в месяце (если меньше нуля
    13.   // или больше длины месяца, тогда в календаре будет пропуск).
    14.   $n = - ($wday - 2);
    15.   $cal = array();
    16.   // Цикл по строкам.
    17.   for ($y=0; $y<6; $y++) {
    18.     // Будущая строка. Вначале пуста.
    19.     $row = array();
    20.     $notEmpty = false;
    21.     // Цикл внутри строки по дням недели.
    22.     for ($x=0; $x<7; $x++, $n++) {
    23.       // Текущее число >0 и < длины месяца?
    24.       if (checkdate($month, $n, $year)) {
    25.         // Да. Заполняем клетку.
    26.         $row[] = $n;
    27.         $notEmpty = true;
    28.       } else {
    29.         // Нет. Клетка пуста.
    30.         $row[] = "";
    31.       }
    32.     }
    33.     // Если в данной строке нет ни одного непустого элемента,
    34.     // значит, месяц кончился.
    35.     if (!$notEmpty) break;
    36.     // Добавляем строку в массив.
    37.     $cal[] = $row;
    38.   }
    39.   return $cal;
    40. }
    41.  
    42. // Формируем календарь на текущий месяц.
    43. $now = getdate();
    44. $cal = makeCal($now['year'], $now['mon']-1);
    45. ?>
    46. <!-- Шаблон вывода календаря. -->
    47. <table border=1>
    48.   <tr>
    49.     <td>Пн</td>
    50.     <td>Вт</td>
    51.     <td>Ср</td>
    52.     <td>Чт</td>
    53.     <td>Пт</td>
    54.     <td>Сб</td>
    55.     <td style="color:red">Вс</td>
    56.   </tr>
    57.   <!-- цикл по строкам -->
    58.   <?foreach ($cal as $row) {?>
    59.     <tr>
    60.       <!-- цикл по столбам -->
    61.       <?foreach ($row as $i=>$v) {?>
    62.         <!-- воскресенье - "красный" день -->
    63.         <td style="<?=$i==6? 'color:red' : ''?>">
    64.           <?=$v? $v : "&nbsp;"?>
    65.         </td>
    66.       <?}?>
    67.     </tr>
    68.   <?}?>
    69. </table>
     
  5. kilogram

    kilogram Активный пользователь

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Вроде работает, не совсем въехал в эту строку, объясните её если кто может.

    Код (Text):
    1.  
    2.  $wday = JDDayOfWeek(GregorianToJD($month, 1, $year), 0);
     
  6. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    А чтобы въехать в эту строку достаточно открыть мануал php и посмотреть, что же делают эти функции. Кстати, описание обоих этих функции в мануале - даже переведено на русский! :)
     
  7. kilogram

    kilogram Активный пользователь

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Вроде разобрался, возращается день недели, а вот здесь Не могу понять, почему здесь -2?
    Код (Text):
    1.  $n = - ($wday - 2);