2008-11-05 62 views
2

我必须建立一个HTML表格,显示用户和访问页面的数据。对于和/或foreach循环来说,它看起来很快乐,但我想不出任何更好的东西。我使用PHP,但我会认为这是语言不可知的。循环是建立表格的最佳方式吗?

回答

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); 

至少这样它可能有点维护。你不必担心不完整的字符串。

你也可以subsitutue一些代码与

$hdata = "<tr><td>" . implode("</td><td>", array_keys($data[0])) . "</td></tr>"; 
    $rdata .= "<tr><td>" . implode("</td><td>", $rowvalue) . "</td></tr>"; 

其中,同时相当简洁,很可能会得到你的一点热水,最终,它会需要重新编码。 (并且implode在内部运行一个循环,所以它是一个双输)。

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

$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醒来。

+0

我真的很喜欢那样。它使得代码更加整洁,而不是随机字符串循环。 – 2008-11-05 15:22:35

+0

在PHP代码中损坏HTML,这是(IMNSHO)甚至比HTML中的代码糟糕。 – Javier 2008-11-05 15:23:32

4

好吧,如果你有多个行,每行有类似格式化的数据,我不能想办法来创建避免使用循环的表。这种类型的东西基本上是为了什么循环而发明的。

如果你给我们要建表的详细信息,也许我们可以制定一个更好的方法。

3

如果你那么你需要硬编码在你的代码,这可能是一个更糟糕的主意

2

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

1

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

在最后,不过,即使是中继器使用某种循环......

2

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

-1

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

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; 
} 
0

为什么要避免循环?如果你有一套物品,并且你想要显示每个物品,那么确定地循环这些物品是明显的解决方案?

如果您试图从视图中分离模型或编写更多可读代码,但循环本身并不坏。