Показывать значения из БД в определенной ячейке таблицы HTML

#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>';
}