В книге там прохожу немного даты и такой окд, вроде все верно написал, но он ругается на второй орич в конце кода непонятно почему. Код (Text): <?php //echo '<pre>'.print_r(getdate(),1).'</pre>'; function Calendar($year,$month){ $wday = JDDayofWeek(GregorianToJD($month,1,$year),0); if($wday == 0) $wday = 7; $n = - ($wday - 2); $cal = array(); for($j = 0; $j < 6; $j++){ $row = array(); $notEmpty = false; for($x = 0; $x < 7; $x++,$n++){ if(checkdate($month,$n,$year)){ $row[] = $n; $notEmpty = true; } else{ $row = ''; } } if(!$notEmpty) break; $cal[] = $row; } return $cal; } //Формируем календарь на текущий месяц $now = getdate(); $cal = Calendar($now['year'],$now['mon']-1); ?> <!-- Шаблон вывода календаря --> <table border="1"> <tr> <td>Пн</td> <td>Вт</td> <td>Ср</td> <td>Чт</td> <td>Пт</td> <td>Сб</td> <td style="color:red">Вс</td> </tr> <? foreach ($cal as $row) {?> <tr> <? foreach ($row as $i=>$v){?> <td style="<?=$i==6?'color:red':''?>"> <?=$v? $v : ' '?> </td> <? } ?> </tr> <? } ?> </table> Код (Text): Warning: Invalid argument supplied for foreach() in C:\www\htdocs\test.ru\www\index.php on line 39
Я так понял из-за вот этого места может for($j = 0; $j < 6; $j++){ Если написать там for($j = 0; $j < 5; $j++){ тогда выведет без ошибки, но выведет не все рабочие дни этого месяца.
Вот взял исходник, нашел папку этого календаря и выдает что 1 июня это воскресенье, что за бред? Автор книги ошибся что ли? Что может не правильно быть в коде, как-то странно. Вот оригинал автора с книги. Вот на сервер забросил результат http://santa.comoj.com/ Код (Text): <?php ## Календарь на текущий месяц. // Функция формирует двумерный массив, представляющий собой // календарь на указанный месяц и год. Массив состоит из строк, // соответствующих неделям. Каждая строка - массив из семи // элементов, которые равны числам (или пустой строке, если // данная клетка календаря пуста). function makeCal($year, $month) { // Получаем номер дня недели для 1 числа месяца. Корректируем // его, чтобы воскресенье соответствовало числу 7, а не числу 0. $wday = JDDayOfWeek(GregorianToJD($month, 1, $year), 0); if ($wday == 0) $wday = 7; // Начинаем с этого числа в месяце (если меньше нуля // или больше длины месяца, тогда в календаре будет пропуск). $n = - ($wday - 2); $cal = array(); // Цикл по строкам. for ($y=0; $y<6; $y++) { // Будущая строка. Вначале пуста. $row = array(); $notEmpty = false; // Цикл внутри строки по дням недели. for ($x=0; $x<7; $x++, $n++) { // Текущее число >0 и < длины месяца? if (checkdate($month, $n, $year)) { // Да. Заполняем клетку. $row[] = $n; $notEmpty = true; } else { // Нет. Клетка пуста. $row[] = ""; } } // Если в данной строке нет ни одного непустого элемента, // значит, месяц кончился. if (!$notEmpty) break; // Добавляем строку в массив. $cal[] = $row; } return $cal; } // Формируем календарь на текущий месяц. $now = getdate(); $cal = makeCal($now['year'], $now['mon']-1); ?> <!-- Шаблон вывода календаря. --> <table border=1> <tr> <td>Пн</td> <td>Вт</td> <td>Ср</td> <td>Чт</td> <td>Пт</td> <td>Сб</td> <td style="color:red">Вс</td> </tr> <!-- цикл по строкам --> <?foreach ($cal as $row) {?> <tr> <!-- цикл по столбам --> <?foreach ($row as $i=>$v) {?> <!-- воскресенье - "красный" день --> <td style="<?=$i==6? 'color:red' : ''?>"> <?=$v? $v : " "?> </td> <?}?> </tr> <?}?> </table>
Вроде работает, не совсем въехал в эту строку, объясните её если кто может. Код (Text): $wday = JDDayOfWeek(GregorianToJD($month, 1, $year), 0);
А чтобы въехать в эту строку достаточно открыть мануал php и посмотреть, что же делают эти функции. Кстати, описание обоих этих функции в мануале - даже переведено на русский!
Вроде разобрался, возращается день недели, а вот здесь Не могу понять, почему здесь -2? Код (Text): $n = - ($wday - 2);