Нужна отдельная страничка или скрипт в страницу, содержащая таблицу из 5 строк, средняя из которых отображает текущий цикл. Циклов - 13 шт. в каждом году, каждый цикл имеет жесткую дату начала и конца. Цикл кодируется 4 цифрами, из которых первые две - год, последние две - номер цикла. Циклы меняются каждые 28 дней. например: 0812 - 20 Nov 2008 - 17 Dec 2008 0813 - 18 Dec 2008 - 14 Jan 2009 0901 - 15 Jan 2009 - 11 Feb 2009 0902 - 12 Feb 2009 - 11 Mar 2009 0903 - 12 Mar 2009 - 08 Apr 2009 Теоретически предполагаю 2 варианта создания: 1 - полная генерация календаря от какого-то первоначально заданного цикла 2 - загрузка строк из файла/таблицы/массива
Проблема в том, что человек не знает, как это сделать. PHP: <?php function getcycle($day,$month,$year,$limit) { $start=mktime(0,0,0,$month,$day,$year); $current=$start; $ncycle=1; $result=array(); for ($i=1;$i<=$limit;$i++) { $result[$i]['n']=date('y',$current).($ncycle>9?$ncycle:'0'.$ncycle); $result[$i]['start']=date('d M Y',$current); $result[$i]['stop']=date('d M Y',$current+60*60*24*27); $ncycle=$ncycle<13?$ncycle+1:1; $current+=(60*60*24*28); } return $result; } /* Сгенерирует 20 циклов, начиная от 27 января 2009 года) */ $cycls=getcycle(27,1,2009,20); print_r($cycls); ?> массив на выходе: Код (Text): Array ( [1] => Array ( [n] => 0901 [start] => 27 Jan 2009 [stop] => 23 Feb 2009 ) [2] => Array ( [n] => 0902 [start] => 24 Feb 2009 [stop] => 23 Mar 2009 ) [3] => Array ( [n] => 0903 [start] => 24 Mar 2009 [stop] => 20 Apr 2009 ) [4] => Array ( [n] => 0904 [start] => 21 Apr 2009 [stop] => 18 May 2009 ) [5] => Array ( [n] => 0905 [start] => 19 May 2009 [stop] => 15 Jun 2009 ) [6] => Array ( [n] => 0906 [start] => 16 Jun 2009 [stop] => 13 Jul 2009 ) [7] => Array ( [n] => 0907 [start] => 14 Jul 2009 [stop] => 10 Aug 2009 ) [8] => Array ( [n] => 0908 [start] => 11 Aug 2009 [stop] => 07 Sep 2009 ) [9] => Array ( [n] => 0909 [start] => 08 Sep 2009 [stop] => 05 Oct 2009 ) [10] => Array ( [n] => 0910 [start] => 06 Oct 2009 [stop] => 02 Nov 2009 ) [11] => Array ( [n] => 0911 [start] => 03 Nov 2009 [stop] => 30 Nov 2009 ) [12] => Array ( [n] => 0912 [start] => 01 Dec 2009 [stop] => 28 Dec 2009 ) [13] => Array ( [n] => 0913 [start] => 29 Dec 2009 [stop] => 25 Jan 2010 ) [14] => Array ( [n] => 1001 [start] => 26 Jan 2010 [stop] => 22 Feb 2010 ) [15] => Array ( [n] => 1002 [start] => 23 Feb 2010 [stop] => 22 Mar 2010 ) [16] => Array ( [n] => 1003 [start] => 23 Mar 2010 [stop] => 19 Apr 2010 ) [17] => Array ( [n] => 1004 [start] => 20 Apr 2010 [stop] => 17 May 2010 ) [18] => Array ( [n] => 1005 [start] => 18 May 2010 [stop] => 14 Jun 2010 ) [19] => Array ( [n] => 1006 [start] => 15 Jun 2010 [stop] => 12 Jul 2010 ) [20] => Array ( [n] => 1007 [start] => 13 Jul 2010 [stop] => 09 Aug 2010 ) )
GudGuy Это идея для стартапа! [vs] А мне накидаешь код? Нужно, чтобы у меня смс отправлялись с распознаванием каптч.
Спасибо большое, но с массивом пока ничего не могу сделать. Я только начинаю изучать PHP, а тут такая задача сразу возникла. Мне нужно, чтобы в виде таблицы высвечивался данный календарь, причем текущий цикл выделялся от остальных (прошедших и будущих)
добавить в него никсывае даты начала. при запуске проверять разницу между датой начала и сегодняшним днём. если она больше нуля, но меньше 86400*28, то значит в таблицу надо поместить 2 придыдущих текущий и два последующих. толко в этом случае запускать рекомендую не от сегодняешней даты, а месяца на 4 раньше=) дабы дыла возможность вставить 2 придыдущих. в целом в этом куске на мой взгялд есть всё для этого, кроме SQL запросов. Но, за этим возвращайся. попробуй хотя бы сам сделать=)
notarget Это всё делается легко с помощью этой функции: PHP: <?php /* Функция, вычисляющая циклы, и помещающая их в массив */ function getcycle($day,$month,$year,$limit) { $start=mktime(0,0,0,$month,$day,$year); //Получаем timestamp для стартовой даты $current=$start; $ncycle=1; $result=array(); for ($i=1;$i<=$limit;$i++) { //В цикле... $result[$i]['n']=date('y',$current).($ncycle>9?$ncycle:'0'.$ncycle); //В массив добавляется номер цикла $result[$i]['start']=date('d M Y',$current); //Дата начала $result[$i]['stop']=date('d M Y',$current+60*60*24*27); //И дата конца (дата_начала+27 дней) $ncycle=$ncycle<13?$ncycle+1:1; $current+=(60*60*24*28); //Следующий цикл начнется через 28 дней после начала текущего } return $result; } /* Получим массив, содержащий 5 циклов */ $cycls=getcycle(01,1,2009,5); /* Переберем все эллементы массива и выведем HTML-таблицу */ /* При этом третью строку надо выделить жирным шрифтом */ echo "<table>\r\n"; foreach ($cycls as $n=>$cycle) { echo '<tr><td>'; echo $n==3?'<b>'.$cycle['n'].'</b>':$cycle['n']; echo '</td><td>'; echo $n==3?'<b>'.$cycle['start'].'</b>':$cycle['start']; echo '</td><td>'; echo $n==3?'<b>'.$cycle['stop'].'</b>':$cycle['stop']; echo "</td></tr>\r\n"; } echo '</table>'; ?> Читай про массивы: http://ru.php.net/manual/ru/language.types.array.php
Помог один товарищ, но тоже не совсем корректно сделал: два файла: jep_loop.php и loop_table.php первый: <?php function get_loop_beg($loop_ind) { if ((($loop_ind%100) == 0) || (($loop_ind%100) > 13)) { return 0; } $cycle_len = 28*60*60*24; $cycle_0 = 810; $date_0 = mktime(0, 0, 0, 9, 25, 2008); $date_year = mktime(0, 0, 0, 1, 1, 2000+$loop_ind/100); // начало года по числу сотен в номере цикла if ($date_year>=$date_0) { $off = ($date_year-$date_0) % $cycle_len; // через сколько начнется первый цикл года } else { $off = ($date_0-$date_year+60*60*24) % $cycle_len; // через сколько начнется первый цикл года } if ($off == $cycle_len) { $off = 0; } // нормировали остаток цикла return $date_year+$off+($loop_ind%100-1)*$cycle_len; } function get_renew_beg($loop_ind) { $befo_renew = 10*60*60*24; return get_loop_beg($loop_ind+1)-$befo_renew; } ?> Второй: <?php include "jep_loop.php" ?> <html> <body> <table border=1 cellspacing=0 cellpadding=0> <tr bgcolor=#87CEEB> <th width=200><i>Цикл</i></td> <th width=200><i>Дата начала цикла</i></td> <th width=200><i>Дата окончания цикла</i></td> </tr> <?php $y = date("Y"); $now = mktime(0, 0, 0, date("m"), date("d"), date("Y")); $n = 0; for($i=0;$n<27;$i++) { $k = ($y-2000)*100+$i; $res = get_loop_beg($k); if ($res) { if ($n%2) print " <tr bgcolor=#F0E68C>\n"; else print " <tr bgcolor=#FFFFFF>\n"; if ($res<=$now && $res+28*60*60*24>=$now) { $c1="<font color=#FF0000>"; $c2="</font>"; } else { $c1=""; $c2=""; } printf(" <td><b><center>%s%04d%s</center></b></td>\n", $c1, $k, $c2); printf(" <td><b><center>%s%s%s</center></b></td>\n", $c1, strftime("%d %b %Y", $res), $c2); printf(" <td><b><center>%s%s%s</center></b></td>\n", $c1, strftime("%d %b %Y", $res+27*60*60*24), $c2); print " </tr>\n"; $n++; } } ?> </table> </body> </html> Недостатки: 1. При смене даты на компе на переходное число не верно отображает цикл, например, 12 февраля 2009 года отметит строку 0901 вместо 0902 2. Переход между календарными годами также не верный, несколько дней вообще выпадают из календаря. Товарищ, который делал очень занятой ,поэтому пока не дергаю, пытаюсь сам починить. Если кому интересно в этом разобраться, принимайте участие. P.S. Подсветку синтаксиса в сообщения нужно делать вручную или это как-то можно автоматически сделать?
Вот итог совместных усилий (почти идеальное, 99% соответствует задаче) два файла: airac.php и airac_calc.php первый: PHP: <?php include "menu.php"; include "airac_calc.php"; ?> <html> <div id="table1" style="position:absolute; overflow:hidden; left:255px; top:120px; width:572px; height:600px; z-index:5"> <table border=1 cellspacing=0 cellpadding=0 > <tr bgcolor=#87CEEB> <th width=155><i>Цикл</i></td> <th width=200><i>Дата начала цикла</i></td> <th width=200><i>Дата окончания цикла</i></td> </tr> <?php $day_len = 60*60*24; $cycle_len = 28*$day_len; $y = 2009;//date("Y"); $now = mktime(0, 0, 0, date("m"), date("d"), date("Y")); $n = 0; for($i=0;$n<26;$i++) // число 26 задает количество строк в таблице { $k = ($y-2000)*100+$i; $res = get_loop_beg($k); if ($res) { if ($n%2) print " <tr bgcolor=#F0E68C>\n"; else print " <tr bgcolor=#FFFFFF>\n"; if ($res<=$now && $res+27*$day_len>=$now) { $c1="<font color=#FF0000>"; $c2="</font>"; } else { $c1=""; $c2=""; } printf(" <td><b><center>%s%04d%s</center></b></td>\n", $c1, $k, $c2); printf(" <td><b><center>%s%s%s</center></b></td>\n", $c1, strftime("%d %b %Y", $res), $c2); printf(" <td><b><center>%s%s%s</center></b></td>\n", $c1, strftime("%d %b %Y", $res+$cycle_len-$day_len), $c2); print " </tr>\n"; $n++; } } ?> </table> Второй: PHP: <?php function get_loop_beg($loop_ind) { if ((($loop_ind%100) == 0) || (($loop_ind%100) > 13)) { return 0; } $day_len = 60*60*24; $cycle_len = 28*$day_len; $cycle_0 = 810; $date_0 = mktime(0, 0, 0, 9, 25, 2008); $date_year = mktime(0, 0, 0, 1, 1, 2000+$loop_ind/100); // начало года по числу сотен в номере цикла if ($date_year>$date_0) $off = ($cycle_len + $day_len + ($date_year-$date_0) % $cycle_len) % $cycle_len; else $off = ($cycle_len + $day_len - ($date_0-$date_year) % $cycle_len) % $cycle_len; // $off = номер дня в цикле, на который приходится первый день года $off = ($off - $off%$day_len) / $day_len; if (!$off) return $date_year+($loop_ind%100-1)*$cycle_len; else return $date_year+$cycle_len-$off*$day_len+$day_len+($loop_ind%100-1)*$cycle_len; } function get_renew_beg($loop_ind) { $day_len = 60*60*24; $befo_renew = 10*$day_len; return get_loop_beg($loop_ind+1)-$befo_renew; } ?>