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