За последние 24 часа нас посетили 18055 программистов и 1654 робота. Сейчас ищут 1398 программистов ...

Генерация html-таблицы

Тема в разделе "Решения, алгоритмы", создана пользователем [vs], 26 авг 2009.

  1. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    При табличной верстке удобно размещать разные блоки в отдельных ячеках таблицы (а не в трех - лево-право-центр), и при этом без геморроя менять размещение и отображение блоков на разных страницах. Для сайтов с простым шаблонным дизайном можно этот каркас генерировать:
    Код (PHP):
    1. <?php
    2. $buffer = "<table width=\"100%\">\r\n";
    3. // Верхние блоки (top)
    4. if (!empty($top))
    5. {
    6.         $colspan = 1;
    7.         $colspan += !empty($left);
    8.         $colspan += !empty($right);
    9.         foreach ($top as $td)
    10.         {
    11.                 $buffer .= "<tr>\r\n<td valign=\"top\" width=\"100%\" colspan=\"{$colspan}\">\r\n{$td}\r\n</td>\r\n</tr>\r\n";
    12.         }
    13. }
    14. // Центральный блок (content)
    15. if (!empty($left))
    16. {
    17.         $buffer .= "<tr>\r\n<td valign=\"top\">\r\n".array_shift($left)."\r\n</td>\r\n";
    18.         $buffer .= "<td valign=\"top\" rowspan=\"".($r=count(count($left)>count($right)?$left:$right)+1)."\" width=\"100%\">\r\n";
    19.         $buffer .= $content;
    20.         $buffer .= "</td>\r\n";
    21. }
    22. else 
    23. {
    24.         $buffer .= "<tr>\r\n<td valign=\"top\" rowspan=\"".count($right)."\" width=\"100%\">\r\n";
    25.         $buffer .= $content;
    26.         $buffer .= "\r\n</td>\r\n";
    27. }
    28. if (!empty($right))
    29. {
    30.         $buffer .= "<td valign=\"top\">\r\n".array_shift($right)."</td>\r\n</tr>\r\n";
    31. }
    32. else 
    33. {
    34.         $buffer .= "</tr>\r\n";
    35. }
    36. // Левые и правые блоки (left, right)
    37. for ($i=0; true; $i++)
    38. {
    39.         $left_exist = key_exists($i, $left);
    40.         $right_exist = key_exists($i, $right);
    41.         if (!$left_exist && !$right_exist)
    42.         {
    43.                 break;
    44.         }
    45.         
    46.         $buffer .= "<tr>\r\n";
    47.         if ($left_exist)
    48.         {
    49.                 $buffer .= "<td valign=\"top\">\r\n{$left[$i]}\r\n</td>";
    50.         }
    51.         elseif (!empty($left)) 
    52.         {
    53.                 $buffer .= "<td valign=\"top\"></td>\r\n";
    54.         }
    55.         
    56.         if($right_exist)
    57.         {
    58.                 $buffer .= "<td valign=\"top\">\r\n{$right[$i]}</td>\r\n";
    59.         }
    60.         $buffer .= "</tr>\r\n";
    61.         
    62.         if (empty($left))
    63.         {
    64.                 $left[0] = true;
    65.         }
    66. }
    67. // Нижние блоки (bottom)
    68. if (!empty($bottom))
    69. {
    70.         //Переменная $colspan объявляется при обработке верхних блоков
    71.         foreach ($bottom as $td)
    72.         {
    73.                 $buffer .= "<tr>\r\n<td valign=\"top\" width=\"100%\" colspan=\"{$colspan}\">\r\n{$td}\r\n</td>\r\n</tr>\r\n";
    74.         }
    75. }
    76. $buffer .= "</table>\r\n";
    77. ?>
    Переменные $top, $left, $right, $bottom - массивы, в элементах которых готовый html-код блоков.

    Отредактировано.
     
  2. kokopelli

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

    С нами с:
    18 авг 2009
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    -то..
    [vs], а можно простенький примерчик использования этого скрипта?

    P.S.
    я решил сделать для себя каркас таблиц и занимался этим в общей сложности сутки. Закончив и заглянув сюда, обнаружил эту тему)). Есть похожие места - я примерно так же делаю colspan. Но основная идея у меня все же другая.. Покажи примерчик, плз
     
  3. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Код (PHP):
    1. <?php
    2. $top = array('<h1>Header</h1>');
    3. $left = array('<h2>Block</h2>','<h2>Block</h2>');
    4. $right = array('<h2>Block</h2>');
    5. $bottom = array('<h1>Footer</h1>');
    6. $content = '<h1>CONTENT</h1>';
    7.  
    8. /* Код */
    9.  
    10. echo $buffer;
    11. ?>
    Результат
    Код (Text):
    1. <table width="100%">
    2. <tr>
    3. <td valign="top" width="100%" colspan="3">
    4. <h1>Header</h1>
    5. </td>
    6. </tr>
    7. <tr>
    8. <td valign="top">
    9. <h2>Block</h2>
    10. </td>
    11. <td valign="top" rowspan="2" width="100%">
    12. <h1>CONTENT</h1></td>
    13. <td valign="top">
    14. <h2>Block</h2></td>
    15. </tr>
    16. <tr>
    17. <td valign="top">
    18. <h2>Block</h2>
    19. </td></tr>
    20. <tr>
    21. <td valign="top" width="100%" colspan="3">
    22. <h1>Footer</h1>
    23. </td>
    24. </tr>
    25. </table>
     
  4. kokopelli

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

    С нами с:
    18 авг 2009
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    -то..
    Спасибо).
    Да, каждый все шаблоны каждый делает "под себя" (С) :), особенно это видно в сравнении. Внимание на чем-то заостряется, и на что-то его не хватает. Решусь показать и свою драндулетку - в ней я сконцентрировался на визуальном представлении (см. пример), а про спан строк, например, совсем забыл - он мне не был нужен)).
    Особо не придирайтесь, я учусь еще, причем сам..
    PHP:
    1. <?php
    2. function htmlTable2($s,$t){
    3.     $rows=preg_split("/\n/",trim($s));
    4.     foreach ($rows as $row){
    5.         $r.='<tr>';
    6.         $row=preg_replace("/(^\|)|(\|$)/",'',trim($row));
    7.         $cells=preg_split("/\|/",$row);
    8.         $ColSpan=1;
    9.         foreach ($cells as $cell){
    10.             if ($cell=='') $ColSpan++;
    11.             else {
    12.                 $r.="<t$t";
    13.                 if ($ColSpan>1) $r.=" colspan=\"$ColSpan\"";
    14.                 $ColSpan=1;
    15.                 $LSp=preg_match("/^\s/",$cell);
    16.                 $RSp=preg_match("/\s$/",$cell);
    17.                 if ($LSp||$RSp){
    18.                     $r.=" align=";
    19.                     if ($RSp) {
    20.                         if ($LSp) $r.="\"center\"";
    21.                         else $r.="\"left\"";
    22.                     }
    23.                     else $r.="\"right\"";
    24.                 }
    25.                 $r.='> '.trim($cell)." </t$t>";
    26.             }
    27.         }
    28.         $r.='</tr>';
    29.     }
    30.     return $r;
    31. }
    32.    
    33. function htmlTable() {
    34.     $r='<table '.func_get_arg(0).'>';
    35.     $s=func_get_arg(1);  // head or body
    36.     if (func_num_args()<3) $r.=htmlTable2($s,'d');  // just body
    37.     else {
    38.         if ($s>'') $r.='<thead>'.htmlTable2($s,'h').'</thead>';
    39.         if (func_num_args()>3) {
    40.             $s=func_get_arg(3);    // footer
    41.             if ($s>'') $r.='<tfoot>'.htmlTable2($s,'d').'</tfoot>';
    42.         }
    43.         $s=func_get_arg(2);    // body
    44.         if ($s>'') $r.='<tbody>'.htmlTable2($s,'d').'</tbody>';
    45.     }    
    46.     $r.='</table>';
    47.     return $r;
    48. }
    49.  
    50. echo htmlTable("border=\"1\" width=\"100%\"","
    51. | n ||| Just a table |
    52. ","
    53. | 1. | aaa |bbb | ccc|
    54. | 2. || aaa+bbb |c   |
    55. | 3a | a   || DD     |
    56. ","
    57. ||| total: |      $50|
    58. "
    59. );
    60. ?>
    Приведенный пример выдает такой вот HTML (разбито на строки и отступы - вручную прям тут):
    HTML:
    1. <table border="1" width="100%">
    2. <tr>
    3.   <th align="center"> n </th><th colspan="3" align="center"> Just a table </th>
    4. </tr>
    5. <tr>
    6.   <td colspan="3" align="center"> total: </td><td align="right"> $50 </td>
    7. </tr>
    8. <tr>
    9.   <td align="center"> 1. </td>
    10.   <td align="center"> aaa </td>
    11.   <td align="left"> bbb </td>
    12.   <td align="right"> ccc </td>
    13. </tr>
    14. <tr>
    15.   <td align="center"> 2. </td>
    16.   <td colspan="2" align="center"> aaa+bbb </td>
    17.   <td align="left"> c </td>
    18. </tr>
    19. <tr>
    20.   <td align="center"> 3a </td>
    21.   <td align="center"> a </td>
    22.   <td colspan="2" align="center"> DD </td>
    23. </tr>