Я обычно делаю что-то вроде этого:
$header_done = false;
while($rs = mysql_fetch_assoc($result))
{
if (!$header_done)
{
echo "<tr>";
foreach ($rs as $k=>$v)
{
echo "<td>" . htmlspecialchars ($k) . "</td>";
}
$header_done = true;
echo "</tr>";
}
// etc...
}
обновление: вот функция, которую я написал несколько лет назад, которую я иногда использую
function EZ_TBL ( $all_rows, $first_row_headers=TRUE )
{
$tr = array ();
if ( $first_row_headers )
{
$td = array ();
foreach ( $all_rows[0] as $k=>$v )
{
if ( $k == 'sort_order' ) continue;
$td[] = strtoupper ( $k );
}
$tr[] = '<td class="header_row">' . implode ( '</td><td class="header_row">', $td ) . '</td>';
}
usort ( $all_rows, 'sort_by_sort_order' );
foreach ( $all_rows as $row )
{
$td = array ();
foreach ( $row as $k=>$v )
{
if ( $k == 'sort_order' ) continue;
if ( $k == 'url' )
{
$td[] = '<a href="' . $v . '">' . $v . '</a>';
} else {
$td[] = $v;
}
}
$tr[] = '<td>' . implode ( "</td>\n<td>", $td ) . '</td>';
}
return '<table><tr>' . implode ( "</tr>\n<tr>", $tr ) . '</tr></table>';
}