【问题标题】:How to merge cells in php generated table?如何合并php生成的表格中的单元格?
【发布时间】:2023-04-04 04:44:01
【问题描述】:

我在此站点上找到了在重复 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>

我希望一切都有意义!

【问题讨论】:

  • 我从这个 xml 文件中提取它:link。是这个意思吗?

标签: php html-table cells


【解决方案1】:

或者,有没有办法告诉空单元格没有边框

这是更简单的方法,只需在空单元格中添加一些类(如 &lt;td class="empty"&gt; &lt;/td&gt; 并在您的 css 中使用 td.empty { border-top:none; } 设置样式

【讨论】:

    【解决方案2】:

    rowspan 肯定是要走的路。但是,您需要跟踪要跨越的行数,然后相应地构造 HTML,而不是随手吐出 HTML。

    这是一个没有简单解决方案的有趣问题。问题是rowspan 必须驻留在第一个&lt;td&gt; 中,但是在处理完它们之后 之前你不会知道要跨越多少行。最好的办法是查看 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>
    

    复制代码并运行它。布局正是您所要求的,但您自然需要根据自己的需要进行调整。

    【讨论】:

    • 我发现你的问题很有趣,所以我研究了一个解决方案并更新了我的答案。如果没有别的,也许你会发现它很有教育意义。 :)
    【解决方案3】:
    <tr>
      <td colspan="2">a cell using 2 colums</td>
    </tr>
    <tr>
      <td rowspan="2">a cell using 2 rows</td>
    </tr>
    

    希望有帮助

    【讨论】:

    • 但这是一个 PHP 循环,并不是每个人都需要 span(请参阅我帖子中的链接),所以我看不出这有什么帮助...?我有点需要它回去看看一个单元格是空的,然后让上面的那个单元格添加行跨度。
    猜你喜欢
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 2013-09-26
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多