2

我正在寻找修改页面上的表格以包含合并的行。

这是处理 mysql db 输出的 php 代码:

######## PRINT OUT TABLE WITH YEARS AND OFFICES PLUS NAMES IN CELLS ########    
for ($y = $year_max; $y >=$year_min; $y--){
    echo '<tr><th>'.$y.'</th>';

    for ($i = 0; $i<count($offices_used); $i++){

        if (isset($data[$y][$offices_used[$i]])){
            echo '<td>'.$data[$y][$offices_used[$i]].'</td>';
        } // END IF

        else {
            echo '<td></td>';
        } // END ELSE

        }   echo '</tr>';
    } // END FOR 

下面的表格是从下面的多维数组生成的;

array (  

[2013] => Array
    (
        [President] => John Mills
        [Internal VP] => Virgil Bagdonas
        [External VP] => Reid Gilmore
        [Treasurer] => Todd Heino
        [Secretary] => Eric Holmquist
        [Newsletter] => Art Bodwell
        [Webmaster] => Dave Eaton
        [Photographer] => Rick Angus
        [Video Librarian] => Mike Peters
        [Store Manager] => Kevin Nee
    )

[2012] => Array
    (
        [President] => Dave Eaton
        [Internal VP] => Jim Metcalf
        [External VP] => Reid Gilmore
        [Treasurer] => Mike Peters
        [Secretary] => Eric Holmquist
        [Newsletter] => Art Bodwell
        [Webmaster] => Dave Eaton
        [Photographer] => Peter Wilcox
        [Video Librarian] => Ray Asselin
        [Store Manager] => Joe Giroux
    )

[2011] => Array
    (
        [President] => Charlie Croteau
        [Internal VP] => Reid Gilmore
        [External VP] => Rick Angus
        [Treasurer] => Mike Peters
        [Secretary] => Eric Holmquist
        [Newsletter] => Ron Rocheleau
        [Webmaster] => Dave Eaton
        [Photographer] => Peter Wilcox
        [Video Librarian] => Ray Asselin
        [Book Librarian] => Roger Boisvert
        [Store Manager] => Mike Smith
    )

...ETC

我的 php 代码现在从 mysql db 生成此表:

<tr>
    <th>Year</th>
    <th>President</th>
    <th>Internal VP</th>
    <th>External VP</th>
    <th>Treasurer</th>
    <th>Secretary</th>
    <th>Webmaster</th>
    <th>Newsletter</th>
    <th>Photographer</th>
    <th>Video Librarian</th>
    <th>Book Librarian</th>
    <th>Store Manager</th>
</tr>

<tr>
    <th>2013</th>
    <td>John Mills</td>
    <td>Virgil Bagdonas</td>
    <td>Reid Gilmore</td>
    <td>Todd Heino</td>
    <td>Eric Holmquist</td>
    <td>Dave Eaton</td>
    <td>Art Bodwell</td>
    <td>Rick Angus</td>
    <td>Mike Peters</td>
    <td></td>
    <td>Kevin Nee</td>
</tr>
<tr>
    <th>2012</th>
    <td>Dave Eaton</td>
    <td>Jim Metcalf</td>
    <td>Reid Gilmore</td>
    <td>Mike Peters</td>
    <td>Eric Holmquist</td>
    <td>Dave Eaton</td>
    <td>Art Bodwell</td>
    <td>Peter Wilcox</td>
    <td>Ray Asselin</td>
    <td></td>
    <td>Joe Giroux</td>
</tr>
<tr>
    <th>2011</th>
    <td>Charlie Croteau</td>
    <td>Reid Gilmore</td>
    <td>Rick Angus</td>
    <td>Mike Peters</td>
    <td>Eric Holmquist</td>
    <td>Dave Eaton</td>
    <td>Ron Rocheleau</td>
    <td>Peter Wilcox</td>
    <td>Ray Asselin</td>
    <td>Roger Boisvert</td>
    <td>Mike Smith</td>
</tr>

但我想修改数组处理输出以获得以下内容:

<tr>
    <th>Year</th>
    <th>President</th>
    <th>Internal VP</th>
    <th>External VP</th>
    <th>Treasurer</th>
    <th>Secretary</th>
    <th>Webmaster</th>
    <th>Newsletter</th>
    <th>Photographer</th>
    <th>Video Librarian</th>
    <th>Book Librarian</th>
    <th>Store Manager</th>
</tr>
<tr>
    <th>2013</th>
    <td>John Mills</td>
    <td>Virgil Bagdonas</td>
    <td rowspan= "3">Reid Gilmore</td>
    <td>Todd Heino</td>
    <td rowspan="3">Eric Holmquist</td>
    <td rowspan="9">Dave Eaton</td>
    <td rowspan="2">Art Bodwell</td>
    <td>Rick Angus</td>
    <td>Mike Peters</td>
    <td></td>
    <td>Kevin Nee</td>
</tr>
<tr>
    <th>2012</th>
    <td>Dave Eaton</td>
    <td>Jim Metcalf</td>
    <td rowspan="2">Mike Peters</td>
    <td>Peter Wilcox</td>
    <td rowspan="3">Ray Asselin</td>
    <td></td>
    <td>Joe Giroux</td>
</tr>
<tr>
    <th>2011</th>
    <td>Charlie Croteau</td>
    <td>Rick Angus</td>
    <td>Ron Rocheleau</td>
    <td>Peter Wilcox</td>
    <td>Roger Boisvert</td>
    <td>Mike Smith</td>
</tr>

欢迎任何有关如何添加标志或计数器来完成此操作的线索。谢谢!

4

3 回答 3

0

试试这个希望工作。(因为我没有运行它,但认为应该工作)。

colspan的代码:

for ($y = $year_max; $y >=$year_min; $y--){
    echo '<tr><th>'.$y.'</th>';

    $lastVal='';
    $buf=array();
    for ($i = 0; $i<count($offices_used); $i++){
        (!isset($data[$y][$offices_used[$i]])?($data[$y][$offices_used[$i]]=''):'');// Im not sure that is really needed

        if($lastVal==$data[$y][$offices_used[$i]]){
            $buf[count($buf)-1]['rep']++;
        }else{
            $lastVal=$data[$y][$offices_used[$i]];
            $buf[]=array('data'=>$lastVal,'rep'=>1);
        }

        foreach($buf as $arr){
            echo '<td'.($arr['rep']>1?' colspan="'.$arr['rep'].'"':'') . '>'.$arr['data'].'</td>';
        }


        }   echo '</tr>';
    } // END FOR 

注意代码错误已更正


行跨度的代码:(我认为它可以比这更容易。但我试图变得很好)。

$buf=array();
for ($i = 0; $i<count($offices_used); $i++){// this loop makes fill $buf
    $lastVal='';
    for ($y = $year_max; $y >=$year_min; $y--){
        (!isset($data[$y][$offices_used[$i]])?($data[$y][$offices_used[$i]]=''):'');// Im not sure that is really needed
        if($lastVal==$data[$y][$offices_used[$i]]){
            $buf[$i][count($buf[$i])-1]['rep']++;
        }else{
            $lastVal=$data[$y][$offices_used[$i]];
            $buf[$i][$year_max-$y]=array('data'=>$lastVal,'rep'=>1);
        }
    }
}
$mtemp=$year_max;
foreach($buf as $row){
    echo '<tr><th>'.$mtemp.'</th>';
    foreach($row as $rec){
        echo '<td'.($rec['rep']>1?' rowspan="'.$rec['rep'].'"':'') . '>'.$rec['data'].'</td>';
    }
    $mtemp--;
    echo '</tr>';
}

真希望能工作。

注意已更正

于 2013-05-25T15:34:00.393 回答
0

几天前我写了一个可以处理这些东西的库。
看看https://github.com/donquixote/cellbrush

该库的好处是您无需考虑 html 中单元格的顺序,以及由于 rowspan 或 colspan 而需要跳过哪些单元格。相反,您可以在网格中的任何位置“绘制”一个单元格,使用您想要的任何行跨度或列跨度。而不是为 rowspan 或 colspan 指定一个数字,您只需指定 rospan/colspan 区域的第一行和最后一行和列名。

例如

$table->td(['2011', '2013'], 'Secretary', 'Eric Holmquist');

下面是在这个库的帮助下创建您要求的表的一些代码。您仍然需要一些逻辑来计算间隔,但至少您不需要担心表格 html 的完整性。

(这个问题已经很老了,但可能仍然有人从谷歌那里遇到它。所以我希望它可能有用。)

<?php

require_once __DIR__ . '/vendor/autoload.php';

$data = array(
  '2013' => array(
    'President' => 'John Mills',
    'Internal VP' => 'Virgil Bagdonas',
    'External VP' => 'Reid Gilmore',
    'Treasurer' => 'Todd Heino',
    'Secretary' => 'Eric Holmquist',
    'Newsletter' => 'Art Bodwell',
    'Webmaster' => 'Dave Eaton',
    'Photographer' => 'Rick Angus',
    'Video Librarian' => 'Mike Peters',
    'Store Manager' => 'Kevin Nee',
  ),
  '2012' => array(
    'President' => 'Dave Eaton',
    'Internal VP' => 'Jim Metcalf',
    'External VP' => 'Reid Gilmore',
    'Treasurer' => 'Mike Peters',
    'Secretary' => 'Eric Holmquist',
    'Newsletter' => 'Art Bodwell',
    'Webmaster' => 'Dave Eaton',
    'Photographer' => 'Peter Wilcox',
    'Video Librarian' => 'Ray Asselin',
    'Store Manager' => 'Joe Giroux',
  ),
  '2011' => array(
    'President' => 'Charlie Croteau',
    'Internal VP' => 'Reid Gilmore',
    'External VP' => 'Rick Angus',
    'Treasurer' => 'Mike Peters',
    'Secretary' => 'Eric Holmquist',
    'Newsletter' => 'Ron Rocheleau',
    'Webmaster' => 'Dave Eaton',
    'Photographer' => 'Peter Wilcox',
    'Video Librarian' => 'Ray Asselin',
    'Book Librarian' => 'Roger Boisvert',
    'Store Manager' => 'Mike Smith',
  ),
);

// Collect positions to build table columns.
$positions = [];
foreach ($data as $year => $yearData) {
  foreach ($yearData as $position => $person) {
    $positions[$position] = TRUE;
  }
}
$positions = array_keys($positions);

// Define table columns.
$table = (new \Donquixote\Cellbrush\Table())
  ->addColName('year')
  ->addColNames($positions)
;

// Create thead section.
$headRow = $table->thead()->addRow('head');
$headRow->th('year', 'Year');
foreach ($positions as $position) {
  $headRow->th($position, $position);
}

// Create table rows with labels based on year.
$years = array_keys($data);
$table->addRowNames($years);
foreach ($years as $year) {
  $table->th($year, 'year', $year);
}

// Fill table cells in each column.
foreach ($positions as $position) {
  $periodPerson = NULL;
  $periodFirstYear = NULL;
  $periodLastYear = NULL;
  $column = $table->colHandle($position);
  foreach ($years as $year) {
    $person = isset($data[$year][$position])
      ? $data[$year][$position]
      : '-';
    if (!isset($periodFirstYear)) {
      // First year.
      $periodFirstYear = $year;
    }
    elseif ($person !== $periodPerson) {
      // Add a table cell with rowspan.
      $column->td([$periodFirstYear, $periodLastYear], $periodPerson);
      $periodFirstYear = $year;
    }
    $periodPerson = $person;
    $periodLastYear = $year;
  }
  if (isset($periodFirstYear)) {
    // Add a table cell with rowspan.
    $column->td([$periodFirstYear, $periodLastYear], $periodPerson);
  }
}

print $table->render();
于 2014-07-13T05:26:00.317 回答
0

通过使用解决:

############################################################################
######## PRINT OUT TABLE WITH YEARS AND OFFICES PLUS NAMES IN CELLS ########    
for ($y = $year_max; $y >=$year_min; $y--){ // Loop through years
    echo '<tr><th>'.$y.'</th>';

    for ($i = 0; $i<count($offices_used); $i++){

        if (isset($data[$y][$offices_used[$i]])){

            $rowz =1;


            if(!($data[$y][$offices_used[$i]] == $data[($y+1)][$offices_used[$i]])){

                while ($data[$y][$offices_used[$i]] == $data[($y-$rowz)][$offices_used[$i]]) $rowz ++; 
                echo '<td rowspan = "'.$rowz.'">'.$data[$y][$offices_used[$i]].'</td>';
            }

        } // END IF

        else {
            echo '<td align = "center"> - </td>';
        } // END ELSE

        }   echo '</tr>';  // End row of current year

} // END FOR Loop through years 
echo '</table>';

有关结果输出页面,请参见http://jsfiddle.net/eaton9999/8gMVK/

再次感谢 imsiso 和其他提供帮助的人!

于 2013-05-25T23:19:11.883 回答