Я делаю HTML-таблицу на основе определенной информации в моей базе данных MySQL. Таблицы мне нужно из базы данных хранятся данные по строкам (RowId, rowname), колонны (columnid, имя_столбца) и данные ячейки. В таблице, которая связывает идентификаторы из строк и столбцов вместе (CellID, RowId, columnid, somedata). таблица выглядит следующим образом:PHP: Создание большой HTML-таблицы эффективно
__________| column1 | column2 | column3 | ...
row1 | somedata | somedata | |
----------|----------|----------|----------|-----
row2 | somedata | | somedata |
----------|----------|----------|----------|-----
... | | | |
Мой подход заключается в использовании нескольких вложенных циклов Foreach, что-то вроде этого:
$rows = new Rows(); //These objects are containers for objects
$columns = new Columns(); //that hold some of the database data.
$alldata = new Alldata(); //MySQL queries within these objects are irrelevant, I think. They already get the relevant data
$count = count($alldata);
echo "<table>";
echo "<tr>";
echo "<td> </td>";
foreach ($columns->getColumns() as $column) {
echo "<td>".$column->getColumnname()."</td>";
}
echo "</tr>";
foreach ($rows->getRows() as $row) {
echo "<tr>";
echo "<td>".$row->getRowname()."</td>";
foreach ($columns->getColumns() as $column) {
$last = 1;
foreach ($alldata->getAlldata() as $data) {
if ($data->getCID() == $column->getID() & $data->getRID() == $row->getID()) { //If the column has data the related to the row
echo "<td>".$data->getSomedata()."</td>";
break;
}
if ($last == $count) { //if loop couldn't find any entries, it prints an empty cell
echo "<td> <td>";
}
$last++
}
}
echo "</tr>";
}
echo "</table>";
Bruteforcing, очевидно, что это не очень эффективный метод, когда существует несколько сотен строки данных в любой таблице в базе данных, и мне это не нравится. Любые идеи, как сделать это более эффективным? Есть ли лучший способ создать таблицу, как мне нужно?
EDIT:
Обдумывая эту проблему в течение недели, я наконец-то дал мне несколько ответов. Это было так просто!
Я сделал небольшую модификацию для моего класса Столбец. Ранее мой код прошел через все возможные записи на celldata таблица в базе данных. Теперь Столбец объект получает массив celldata где столбец соответствует, и я могу сделать сравнение, используя только эти данные.
$rows = new Rows();
$columns = new Columns();
echo "<table>";
echo "<tr>";
echo "<td> </td>";
foreach ($columns->getColumns() as $column) {
echo "<td>".$column->getColumnname()."</td>";
}
echo "</tr>";
foreach ($rows->getRows() as $row) {
echo "<tr>";
echo "<td>".$row->getRowname()."</td>";
foreach ($columns->getColumns() as $column) {
$last = 1;
$count = count($column->getAlldata());
foreach ($column->getAlldata() as $data) {
if ($data->getCID() == $column->getID() & $data->getRID() == $row->getID()) {
echo "<td>".$data->getSomedata()."</td>";
break;
}
if ($last == $count) {
echo "<td> <td>";
}
$last++
}
}
echo "</tr>";
}
echo "</table>";
Гораздо быстрее, хотя все еще грубый, но есть меньше данных для прохождения. Конечно, теперь проблема заключается в том, что В столбцах объекты могут выполнять довольно много запросов MySQL, в зависимости от количества Столбцы есть.
ли идентификаторы строк и столбцов гарантированно будет в порядке? – eggyal
Очень интересный вопрос! –
@eggyal строки и столбцы сортируются по их имени, поэтому нет. – RLXi