Как объединить ячейки в сгенерированной php таблице? - PullRequest
4 голосов
/ 12 октября 2011

На этом сайте я нашел решение для отображения пустой ячейки при повторении массива xml, но я не могу найти ответ на объединение пустых ячеек.

Это то, что яполучение:

Вот как я бы хотел, чтобы это выглядело (с точки зрения объединенных ячеек):

Итак, мой вопрос, как мне объединить эти ячейки - сказать предыдущей ячейке использовать диапазон строк?(альтернативно, есть ли способ сказать, что пустые ячейки не имеют границ?

Вот мой код:

<tr>
<?php if ($work_name !=$currentWork) { ?>
    <td>
    <?php 
    if ($name != $currentName) {

        echo html_encode($name);
     }

    $currentName = $name; 

    ?>
    </td>


    <td><i>
    <?php 
    if ($work_name !=$currentWork) {

      echo html_encode($work_name); 
    }

    else {

    echo " ";
    }
    $currentWork = $work_name;


    ?></i></td>                             

    <td>
    <?php 
    if ($role_attrs->name == $previousRole) {
    continue;

    }

    else {
    echo html_encode($role_attrs->name); 


    }

    $previousRole = $role_attrs->name;

    ?></td>
 </tr>

Я надеюсь, что все имеет смысл!

Ответы [ 3 ]

4 голосов
/ 12 октября 2011

в качестве альтернативы, есть ли способ сказать пустым ячейкам, что у них нет границы

Это гораздо более простой способ, просто добавьте некоторый класс в пустую ячейку (например, <td class="empty"> </td> и добавьте его в свой CSS с помощью td.empty { border-top:none; }

2 голосов
/ 13 октября 2011

rowspan, безусловно, путь.Однако вместо того, чтобы выкладывать HTML-код по ходу дела, вам необходимо отслеживать, сколько строк нужно охватить, и затем соответствующим образом создавать HTML-код.

Это интересная проблема без easy решение.Проблема в том, что rowspan должен находиться в первом <td>, но вы не будете знать, сколько строк нужно охватить, пока после не обработаете их.Лучше всего заглянуть в PHP Document Object Model .DOM позволит вам построить таблицу и настроить атрибут rowspan по мере необходимости.

Несколько мест для начала:

Обновление

Это должно проиллюстрировать, что в этом участвует.

<html>
<head>
    <title>My Sample</title>
    <style type="text/css">
    body {
        font: normal 62.5% sans-serif;
    }
    table {
        font-size: 1.3em;
        width: 420px;
        border: 0;
        border-collapse:collapse;
    }
    td {
        vertical-align: top;
        border-bottom: 1px solid #000;
    }
    </style>
</head>
<body>
<?php
$works = array(
    array(
        'composer' => 'HAYDN, Joseph',
        'title' => 'Die Schöpfung',
        'role' => 'Adam'
    ),
    array(
        'composer' => 'HAYDN, Joseph',
        'title' => 'Die Schöpfung',
        'role' => 'Raphäel'
    ),
    array(
        'composer' => 'HAYDN, Joseph',
        'title' => 'Il mondo della luna',
        'role' => 'Ernesto'
    ),
    array(
        'composer' => 'HAYDN, Joseph',
        'title' => 'La vera costanza',
        'role' => 'Masino'
    ),
    array(
        'composer' => 'MENOTTI, Gian Carlo',
        'title' => 'The Telephone',
        'role' => 'Ben'
    ),
    array(
        'composer' => 'MOORE, Douglas',
        'title' => 'Gallantry',
        'role' => 'Dr Gregg'
    ),
    array(
        'composer' => 'MOZART, Wolfgang Amadeus',
        'title' => 'Die Zauberflöte',
        'role' => 'Der Sprecher'
    ),
    array(
        'composer' => 'MOZART, Wolfgang Amadeus',
        'title' => 'Die Zauberflöte',
        'role' => 'Papageno'
    ),
    array(
        'composer' => 'MOZART, Wolfgang Amadeus',
        'title' => 'La nozze di Figaro',
        'role' => 'Il conte Almaviva'
    ),
    array(
        'composer' => 'NICHOLSON, Alisdair',
        'title' => 'Two sisters, a rose, a flood and snow',
        'role' => 'baritone'
    ),
    array(
        'composer' => 'OFFENBACH, Jacques',
        'title' => 'Barbe-bleue',
        'role' => 'Graf Oscar'
    ),
    array(
        'composer' => 'OFFENBACH, Jacques',
        'title' => 'La vie parisienne',
        'role' => 'Bobinet'
    ),
    array(
        'composer' => 'PUCCINI, Giacomo',
        'title' => 'La bohème',
        'role' => 'Schaunard'
    ),
    array(
        'composer' => 'PUCCINI, Giacomo',
        'title' => 'Madama Butterfly',
        'role' => 'Il principe'
    ),
    array(
        'composer' => 'PUCCINI, Giacomo',
        'title' => 'Madama Butterfly',
        'role' => 'Yamadori'
    )
);

$current_composer = '';
$current_title = '';

$composer_row_count = 1;
$title_row_count = 1;

$doc = new DOMDocument();

$table = $doc->createElement('table');
$doc->appendChild($table);

foreach($works as $work)
{
    $row = $doc->createElement('tr');
    $table->appendChild($row);

    if ($current_composer !== $work['composer']) {
        $current_composer = $work['composer'];
        $composer_row_count = 1;

        $composer_col = $doc->createElement('td', $work['composer']);
        $row->appendChild($composer_col);
    } else {
        $composer_col->setAttribute('rowspan', ++$composer_row_count);
    }

    if ($current_title !== $work['title']) {
        $current_title = $work['title'];
        $title_row_count = 1;

        $title_col = $doc->createElement('td', $work['title']);
        $row->appendChild($title_col);
    } else {
        $title_col->setAttribute('rowspan', ++$title_row_count);
    }

    $role_col = $doc->createElement('td', $work['role']);
    $row->appendChild($role_col);
}

echo $doc->saveHTML();
?>
</body>
</html>

Скопируйте код и запустите его.Макет - это именно то, что вы просили, но, естественно, вам нужно будет настроить его под свои нужды.

0 голосов
/ 12 октября 2011
<tr>
  <td colspan="2">a cell using 2 colums</td>
</tr>
<tr>
  <td rowspan="2">a cell using 2 rows</td>
</tr>

Надеюсь, что поможет

...