Избежать циклов, вероятно, невозможно, если не в реализации, то это все равно произойдет на уровне машины.
Однако, если вы хотите остаться «чистым» без неприятного кода, вы можете, по крайней мере, сделать:
$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 )) );
Но будьте осторожны, это трудно читать, и вы продолжите в том же духе, когда однажды проснетесь с недоумением.