循环是构建表的最佳方法吗?

时间:2008-11-05 15:11:29

标签: php html loops html-table

我必须构建一个HTML表格,显示用户数据与访问过的页面数据。使用和/或foreach循环似乎很笨拙,但我想不出更好的东西。我正在使用PHP,但我认为这与语言无关。

8 个答案:

答案 0 :(得分:4)

好吧,如果你有多行,每行的数据格式相似,我想不出一种方法来创建一个避免使用循环的表。这种类型的东西基本上是发明的循环。

如果你给我们提供了你想建立的桌子的更多细节,也许我们可以制定一个更好的方法。

答案 1 :(得分:4)

避免循环可能是不可能的,如果不是在实现中,那么它仍然会在机器级别发生。

但是,如果你想尝试保持'纯'而没有讨厌的代码,你至少可以这样做:

$tableformat = '<table><thead>%s</thead><tbody>%s</tbody></table>';
$rowformat   = '<tr>%s</tr>'; 
$cellformat  = '<td>%s</td>'; 

$hdata = '';
foreach( $data[0] as $cellname => $cellvalue )
{
   $hdata  .= sprintf( $cellformat, $cellname ); 
}
$hdata = sprintf( $rowformat, $hdata ); 
$rdata = "";
foreach( $data as $rownum => $rowvalue ) 
{ 
   $row = "";
   foreach( $rowvalue as $colname => $colvalue ) 
   {
       $row .= sprintf( $cellformat, $colvalue );  
   }
   $rdata .= sprintf($rowformat,$row); 
}
return sprintf( $tableformat, $hdata, $rdata ); 

至少在某种程度上它可能有点可维护。你不必担心不完整的字符串。

您还可以使用

替换部分代码
   $hdata = "<tr><td>" . implode( "</td><td>", array_keys( $data[0] )) . "</td></tr>";
   $rdata .= "<tr><td>" . implode( "</td><td>", $rowvalue ) . "</td></tr>"; 

虽然相当简洁,但最终可能会让你进入一些热水中并且需要重新编码。 (并且内部运行一个循环,所以它是一个双输)。

如果你不介意额外函数调用(并且仍在运行循环)的头脑,这可以使更简洁的代码没有太多的负面因素:

 $tableformat = '<table><thead>%s</thead><tbody>%s</tbody></table>';
 $rowformat   = '<tr>%s</tr>'; 
 $cellformat  = '<td>%s</td>'; 

function tr( $cells )
{  
   $o = "";
   foreach( $cells as $i => $v )
   {  
      $o .= sprintf( $cellformat, $v ); 
   }
   return sprintf( $rowformat, $o );  
}


return sprintf( $tableformat, 
               tr( array_keys($data[0])), 
               implode("", array_map( 'tr', $data )) ); 

但是要注意,这很难读懂,而且有一天你会保持这种状态,你会被lisp唤醒。

答案 2 :(得分:3)

如果你不使用某些类型的循环,那么你需要对代码中的行数和列数进行硬编码,这可能是一个更糟糕的想法

答案 3 :(得分:2)

如果表中的数据是动态的,那么您必须使用循环。即使你得到一个为你生成表的组件,它内部也会使用循环。

答案 4 :(得分:2)

我强烈推荐PHP的Smarty模板引擎。这将允许您使用Smarty语法将表(以及不可避免的相关循环)移动到模板中,因此它将更清晰,更与业务逻辑分离。您可以使用HTML代码段中的一些简单标记替换示例中的几乎所有代码。查看Smarty页面上的速成课程,了解使用表格的示例。

答案 5 :(得分:1)

这取决于你对“最佳”的定义。 FOR循环可以很好地完成工作。我不是PHP程序员,但在.NET中,您可以使用Repeater,这是一种可用于声明表格HTML的模板。它有标题,页脚和每个项目的模板。您将数据源绑定到转发器,它将为您生成表格HTML比使用FOR循环更优雅。我想在PHP中可能存在某种模板等价物。

最后,即使是Repeater使用某种循环......

答案 6 :(得分:0)

为什么要避免循环?如果您有一组项目,并且想要显示每个项目,那么确定循环显示该组合是一个明显的解决方案吗?

如果您尝试将模型与视图分开,或者编写更易读的代码,那么;但循环本身并不坏。

答案 7 :(得分:-1)

我通常在PHP中使用循环和implode。在支持函数式编程的语言中,我会采用不同的方式。

function render_table($data) {
  $html = '<table>';
  $tr = array();
  foreach (array_keys($data[0]) as $key) {
    $tr[] = '<th>' . htmlspecialchars($key) . '</th>';
  }
  $html .= "\n" . '<thead>' . "\n" . '<tr>' . "\n" . implode("\n", $tr) . '</tr>' . '</thead>';
  $tbody = array();
  foreach ($data as $row) {
    $tr = array();
    foreach ($row as $value) {
      $tr[] = '<td>' . htmlspecialchars($value) . '</td>';
    }
    $tbody[] = '<tr>' . "\n" . implode("\n", $tr) . '</tr>';
  }
  $html .= "\n" . '<tbody>' . "\n" . implode("\n", $tbody) . '</tbody>';
  $html .= '</table>';
  return $html;
}