За последние 24 часа нас посетили 59945 программистов и 7157 роботов. Сейчас ищут 2152 программиста ...

Нужна специфическая таблица-календарь

Тема в разделе "PHP для новичков", создана пользователем notarget, 27 янв 2009.

  1. notarget

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

    С нами с:
    27 янв 2009
    Сообщения:
    5
    Симпатии:
    0
    Нужна отдельная страничка или скрипт в страницу, содержащая таблицу из 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 - загрузка строк из файла/таблицы/массива
     
  2. Frozen

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

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    это вопрос или тз?
     
  3. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    это типа месячные подсчитывать? в чём проблема-то?
     
  4. Тигренок

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

    С нами с:
    29 дек 2008
    Сообщения:
    133
    Симпатии:
    0
    Адрес:
    ты такой нарисовался?
    :)))
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.543
    Симпатии:
    623
    Проблема в том, что человек не знает, как это сделать.
    PHP:
    1. <?php
    2. function getcycle($day,$month,$year,$limit) {
    3.         $start=mktime(0,0,0,$month,$day,$year);
    4.         $current=$start;
    5.         $ncycle=1;
    6.         $result=array();
    7.         for ($i=1;$i<=$limit;$i++) {
    8.             $result[$i]['n']=date('y',$current).($ncycle>9?$ncycle:'0'.$ncycle);
    9.             $result[$i]['start']=date('d M Y',$current);
    10.             $result[$i]['stop']=date('d M Y',$current+60*60*24*27);
    11.             $ncycle=$ncycle<13?$ncycle+1:1;
    12.             $current+=(60*60*24*28);
    13.         }
    14.         return $result;
    15. }
    16. /* Сгенерирует 20 циклов, начиная от 27 января 2009 года) */
    17. $cycls=getcycle(27,1,2009,20);
    18. print_r($cycls);
    19. ?>
    массив на выходе:
    Код (Text):
    1. Array
    2. (
    3.     [1] => Array
    4.         (
    5.             [n] => 0901
    6.             [start] => 27 Jan 2009
    7.             [stop] => 23 Feb 2009
    8.         )
    9.  
    10.     [2] => Array
    11.         (
    12.             [n] => 0902
    13.             [start] => 24 Feb 2009
    14.             [stop] => 23 Mar 2009
    15.         )
    16.  
    17.     [3] => Array
    18.         (
    19.             [n] => 0903
    20.             [start] => 24 Mar 2009
    21.             [stop] => 20 Apr 2009
    22.         )
    23.  
    24.     [4] => Array
    25.         (
    26.             [n] => 0904
    27.             [start] => 21 Apr 2009
    28.             [stop] => 18 May 2009
    29.         )
    30.  
    31.     [5] => Array
    32.         (
    33.             [n] => 0905
    34.             [start] => 19 May 2009
    35.             [stop] => 15 Jun 2009
    36.         )
    37.  
    38.     [6] => Array
    39.         (
    40.             [n] => 0906
    41.             [start] => 16 Jun 2009
    42.             [stop] => 13 Jul 2009
    43.         )
    44.  
    45.     [7] => Array
    46.         (
    47.             [n] => 0907
    48.             [start] => 14 Jul 2009
    49.             [stop] => 10 Aug 2009
    50.         )
    51.  
    52.     [8] => Array
    53.         (
    54.             [n] => 0908
    55.             [start] => 11 Aug 2009
    56.             [stop] => 07 Sep 2009
    57.         )
    58.  
    59.     [9] => Array
    60.         (
    61.             [n] => 0909
    62.             [start] => 08 Sep 2009
    63.             [stop] => 05 Oct 2009
    64.         )
    65.  
    66.     [10] => Array
    67.         (
    68.             [n] => 0910
    69.             [start] => 06 Oct 2009
    70.             [stop] => 02 Nov 2009
    71.         )
    72.  
    73.     [11] => Array
    74.         (
    75.             [n] => 0911
    76.             [start] => 03 Nov 2009
    77.             [stop] => 30 Nov 2009
    78.         )
    79.  
    80.     [12] => Array
    81.         (
    82.             [n] => 0912
    83.             [start] => 01 Dec 2009
    84.             [stop] => 28 Dec 2009
    85.         )
    86.  
    87.     [13] => Array
    88.         (
    89.             [n] => 0913
    90.             [start] => 29 Dec 2009
    91.             [stop] => 25 Jan 2010
    92.         )
    93.  
    94.     [14] => Array
    95.         (
    96.             [n] => 1001
    97.             [start] => 26 Jan 2010
    98.             [stop] => 22 Feb 2010
    99.         )
    100.  
    101.     [15] => Array
    102.         (
    103.             [n] => 1002
    104.             [start] => 23 Feb 2010
    105.             [stop] => 22 Mar 2010
    106.         )
    107.  
    108.     [16] => Array
    109.         (
    110.             [n] => 1003
    111.             [start] => 23 Mar 2010
    112.             [stop] => 19 Apr 2010
    113.         )
    114.  
    115.     [17] => Array
    116.         (
    117.             [n] => 1004
    118.             [start] => 20 Apr 2010
    119.             [stop] => 17 May 2010
    120.         )
    121.  
    122.     [18] => Array
    123.         (
    124.             [n] => 1005
    125.             [start] => 18 May 2010
    126.             [stop] => 14 Jun 2010
    127.         )
    128.  
    129.     [19] => Array
    130.         (
    131.             [n] => 1006
    132.             [start] => 15 Jun 2010
    133.             [stop] => 12 Jul 2010
    134.         )
    135.  
    136.     [20] => Array
    137.         (
    138.             [n] => 1007
    139.             [start] => 13 Jul 2010
    140.             [stop] => 09 Aug 2010
    141.         )
    142.  
    143. )
     
  6. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.432
    Симпатии:
    0
    GudGuy
    Это идея для стартапа! :)

    [vs]
    А мне накидаешь код? Нужно, чтобы у меня смс отправлялись с распознаванием каптч.
     
  7. akrinel

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

    С нами с:
    26 янв 2009
    Сообщения:
    954
    Симпатии:
    1
    Адрес:
    Spb
  8. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.036
    Симпатии:
    0
    [vs], Тебе надо в Шоу Экстрасенсов! Я нифига по ТЗ не понял! ;-)
     
  9. notarget

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

    С нами с:
    27 янв 2009
    Сообщения:
    5
    Симпатии:
    0
    Спасибо большое, но с массивом пока ничего не могу сделать. Я только начинаю изучать PHP, а тут такая задача сразу возникла. Мне нужно, чтобы в виде таблицы высвечивался данный календарь, причем текущий цикл выделялся от остальных (прошедших и будущих)
     
  10. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.432
    Симпатии:
    0
    То, что там предлагается -- слишком примитивно.
     
  11. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    добавить в него никсывае даты начала. при запуске проверять разницу между датой начала и сегодняшним днём. если она больше нуля, но меньше 86400*28, то значит в таблицу надо поместить 2 придыдущих текущий и два последующих. толко в этом случае запускать рекомендую не от сегодняешней даты, а месяца на 4 раньше=) дабы дыла возможность вставить 2 придыдущих. в целом в этом куске на мой взгялд есть всё для этого, кроме SQL запросов. Но, за этим возвращайся. попробуй хотя бы сам сделать=)
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.543
    Симпатии:
    623
    notarget
    Это всё делается легко с помощью этой функции:
    PHP:
    1. <?php
    2. /* Функция, вычисляющая циклы, и помещающая их в массив */
    3. function getcycle($day,$month,$year,$limit) {
    4.         $start=mktime(0,0,0,$month,$day,$year); //Получаем timestamp для стартовой даты
    5.         $current=$start;
    6.         $ncycle=1;
    7.         $result=array();
    8.         for ($i=1;$i<=$limit;$i++) { //В цикле...
    9.             $result[$i]['n']=date('y',$current).($ncycle>9?$ncycle:'0'.$ncycle); //В массив добавляется номер цикла
    10.             $result[$i]['start']=date('d M Y',$current); //Дата начала
    11.             $result[$i]['stop']=date('d M Y',$current+60*60*24*27); //И дата конца (дата_начала+27 дней)
    12.             $ncycle=$ncycle<13?$ncycle+1:1;
    13.             $current+=(60*60*24*28); //Следующий цикл начнется через 28 дней после начала текущего
    14.         }
    15.         return $result;
    16. }
    17. /* Получим массив, содержащий 5 циклов */
    18. $cycls=getcycle(01,1,2009,5);
    19. /* Переберем все эллементы массива и выведем HTML-таблицу */
    20. /* При этом третью строку надо выделить жирным шрифтом */
    21. echo "<table>\r\n";
    22. foreach ($cycls as $n=>$cycle) {
    23.     echo '<tr><td>';
    24.     echo $n==3?'<b>'.$cycle['n'].'</b>':$cycle['n'];
    25.     echo '</td><td>';
    26.     echo $n==3?'<b>'.$cycle['start'].'</b>':$cycle['start'];
    27.     echo '</td><td>';
    28.     echo $n==3?'<b>'.$cycle['stop'].'</b>':$cycle['stop'];
    29.     echo "</td></tr>\r\n";
    30. }
    31. echo '</table>';
    32. ?>
    Читай про массивы: http://ru.php.net/manual/ru/language.types.array.php
     
  13. notarget

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

    С нами с:
    27 янв 2009
    Сообщения:
    5
    Симпатии:
    0
    Помог один товарищ, но тоже не совсем корректно сделал:

    два файла: 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. Подсветку синтаксиса в сообщения нужно делать вручную или это как-то можно автоматически сделать?
     
  14. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.432
    Симпатии:
    0
    В начале php-кода пишите <?php, если его нет. Выделяйте код и кликайте кнопку "PHP".
     
  15. notarget

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

    С нами с:
    27 янв 2009
    Сообщения:
    5
    Симпатии:
    0
    Вот итог совместных усилий (почти идеальное, 99% соответствует задаче)

    два файла: airac.php и airac_calc.php

    первый:

    PHP:
    1.  
    2.  
    3. <?php
    4.   include "menu.php";
    5.   include "airac_calc.php";
    6. ?>
    7.  
    8. <html>
    9.  
    10. <div id="table1" style="position:absolute; overflow:hidden; left:255px; top:120px; width:572px; height:600px; z-index:5">
    11. <table border=1 cellspacing=0 cellpadding=0 >
    12.  <tr bgcolor=#87CEEB>
    13.    <th width=155><i>Цикл</i></td>
    14.    <th width=200><i>Дата начала цикла</i></td>
    15.    <th width=200><i>Дата окончания цикла</i></td>
    16.  </tr>
    17.  
    18.  
    19. <?php
    20.   $day_len = 60*60*24;
    21.   $cycle_len = 28*$day_len;
    22.   $y = 2009;//date("Y");
    23.   $now = mktime(0, 0, 0, date("m"), date("d"), date("Y"));
    24.   $n = 0;
    25.   for($i=0;$n<26;$i++) // число 26 задает количество строк в таблице
    26.   {
    27.    $k = ($y-2000)*100+$i;
    28.    $res = get_loop_beg($k);
    29.    if ($res)
    30.    {
    31.      if ($n%2)
    32.        print " <tr bgcolor=#F0E68C>\n";
    33.      else
    34.        print " <tr bgcolor=#FFFFFF>\n";
    35.      if ($res<=$now && $res+27*$day_len>=$now)
    36.      {
    37.        $c1="<font color=#FF0000>";
    38.        $c2="</font>";
    39.      }
    40.      else
    41.      {
    42.        $c1="";
    43.        $c2="";
    44.      }
    45.      printf("  <td><b><center>%s%04d%s</center></b></td>\n", $c1, $k, $c2);
    46.      printf("  <td><b><center>%s%s%s</center></b></td>\n", $c1, strftime("%d %b %Y", $res), $c2);
    47.      printf("  <td><b><center>%s%s%s</center></b></td>\n", $c1, strftime("%d %b %Y", $res+$cycle_len-$day_len), $c2);
    48.      print " </tr>\n";
    49.      $n++;
    50.    }
    51.   }
    52. ?>
    53. </table>
    54.  
    55.  

    Второй:


    PHP:
    1.  
    2.  
    3. <?php
    4.  
    5.   function get_loop_beg($loop_ind)
    6.   {
    7.     if ((($loop_ind%100) == 0) || (($loop_ind%100) > 13)) { return 0; }
    8.     $day_len    = 60*60*24;
    9.     $cycle_len  = 28*$day_len;
    10.     $cycle_0    = 810;
    11.     $date_0     = mktime(0, 0, 0, 9, 25, 2008);
    12.  
    13.     $date_year = mktime(0, 0, 0, 1, 1, 2000+$loop_ind/100); // начало года по числу сотен в номере цикла
    14.     if ($date_year>$date_0)
    15.       $off = ($cycle_len + $day_len + ($date_year-$date_0) % $cycle_len) % $cycle_len;
    16.     else
    17.       $off = ($cycle_len + $day_len - ($date_0-$date_year) % $cycle_len) % $cycle_len;
    18.  
    19.     // $off = номер дня в цикле, на который приходится первый день года
    20.     $off = ($off - $off%$day_len) / $day_len;
    21.     if (!$off)
    22.       return $date_year+($loop_ind%100-1)*$cycle_len;
    23.     else
    24.       return $date_year+$cycle_len-$off*$day_len+$day_len+($loop_ind%100-1)*$cycle_len;
    25.   }
    26.  
    27.   function get_renew_beg($loop_ind)
    28.   {
    29.     $day_len    = 60*60*24;
    30.     $befo_renew = 10*$day_len;
    31.     return get_loop_beg($loop_ind+1)-$befo_renew;
    32.   }
    33.  
    34. ?>
    35.  
    36.  
     
  16. notarget

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

    С нами с:
    27 янв 2009
    Сообщения:
    5
    Симпатии:
    0
    Визуально это выглядит следующим образом:

    [​IMG]