#php #loops #html-table
#php #циклы #html-таблица
Вопрос:
Я пытаюсь получить представление таблицы из значений БД по определенному шаблону. Это должно выглядеть так: вид в плане
В БД я добавил значения строк / столбцов, чтобы присвоить «имена ячеек» определенной ячейке:
Используя этот код:
$maxrow = getResult($pdo, "SELECT MAX(row) AS maxrow FROM stalls")["maxrow"];
$maxcol = getResult($pdo, "SELECT MAX(col) AS maxcol FROM stalls")["maxcol"];
$data = $pdo->query("SELECT row, col, number FROM stalls ORDER BY row ASC, col ASC")->fetchAll();
echo'<table style="width:100%;">';
foreach ($data as $entry)
{
if($entry['row'] > 0)
{
for($r=0;$r<=$maxrow;$r )
{
if($r == $entry['row'])
{
echo '<tr style="border: 1px solid black;">';
for($c=1;$c<=$maxcol;$c )
{
if($c == $entry['col'])
{
echo '<td style="border: 1px solid black;">row: '. $r . ' - col: ' . $c . ' - value: ' . $entry['number'] .'</td>';
}
else
{
echo '<td style="border: 1px solid black;"></td>';
}
}
echo '</tr>';
}
}
}
}
echo '</table>';
Я могу получить только это представление:
Как я могу получить значения «строка 1», которые будут отображаться в строке 1, без «сдвига»?
Большое вам спасибо за вашу помощь!
Комментарии:
1. Сначала сохраните ваши данные в многомерном массиве, используя номер строки в качестве ключа на первом уровне, а номер столбца — на втором. Затем вы можете относительно легко создать свою таблицу, используя два вложенных
for
цикла, и при этом вы просто выбираете данные для текущей строки и столбца из своего массива.
Ответ №1:
Вы могли бы попробовать что-то вроде — обратите внимание, что это непроверенный код:
$maxrow = getResult($pdo, "SELECT MAX(row) AS maxrow FROM stalls")["maxrow"];
$maxcol = getResult($pdo, "SELECT MAX(col) AS maxcol FROM stalls")["maxcol"];
$oldRow = 0; // init row counter
$arr = array_fill( 0, $maxcol, "amp;nbsp;" );
$tmp = "";
echo'<table style="width:100%;">';
foreach ($data as $entry) {
// get the data
$row = $entry['row'];
$col = $entry['col'];
$nbr = $entry['number'];
// is the row number different and not the first entry
if( $oldRow != $entry['row'] amp;amp; $oldRow != 0 ) {
//--- convert to html type string
$tmp = implode( "</td><td>", $arr );
//--- show html
echo'<tr><td>".$tmp."</td></tr>";
//--- reset temp values
$arr = array_fill( 0, $maxcol, "amp;nbsp;" );
$oldRow = $entry['row']; // set new row number
}
$arr[$row][$col] = $nbr;
}
//--- convert to html type string for last entry processed
$tmp = implode( "</td><td>", $arr );
//--- show html
echo'<tr><td>".$tmp."</td></tr>";
echo "</table>";
Комментарии:
1. джефф, спасибо за ваш комментарий! к сожалению, это не привело к созданию желаемого макета.
Ответ №2:
Наконец, не очень приятно, но это работает для меня…
// get max rows
$maxrow = getResult($pdo, "SELECT MAX(row) AS maxrow FROM stalls")["maxrow"];
// get max cols
$maxcol = getResult($pdo, "SELECT MAX(col) AS maxcol FROM stalls")["maxcol"];
// get rows and number of cols in row
$rowmeta = $pdo->query("SELECT row, COUNT(*) as count FROM stalls WHERE row <> 0 GROUP BY row ORDER BY row ASC")->fetchAll(PDO::FETCH_ASSOC);
// get rest of stuff
$data = $pdo->query("SELECT row, col, number FROM stalls ORDER BY row ASC, col ASC")->fetchAll(PDO::FETCH_ASSOC);
echo'<table style="table-layout: fixed; width:100%;">';
// iterate trough rows from meta
foreach($rowmeta as $rowmeta_row)
{
echo '<tr style="width: calc(100%/'.$maxcol.');border: 1px solid black;">';
// get data part
foreach($data as $d)
{
// check if we're still in same row as data
if($rowmeta_row["row"] == $d['row'])
{
// move left trough cols
for($c=1;$c<=$maxcol;$c )
{
// check if we're in the right col and it is not an isle
if($c == $d['col'] amp;amp; $d['number'] != 'isle')
{
echo '<td style="border: 1px solid black;">row: '. $d['row'] . ' - col: ' . $d['col'] . ' - value: ' . $d['number'] .'</td>';
}
// still in right col, but isle
if($c == $d['col'] amp;amp; $d['number'] == 'isle')
{
echo '<td style="border: 1px solid black;">leer</td>';
}
}
}
}
echo '</tr>';
}