我正在基于MySQL数据库中的某些信息制作HTML表格。我需要从数据库中获取的表包含行的数据( rowid , rowname ),列( columnid , columnname )和细胞数据。一个表,它将行和列中的ID链接在一起( cellid , rowid , columnid , somedata )。 该表看起来像这样:
__________| 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,显然这不是一个非常有效的方法,当数据库中的任何表上有数百行数据时,我不喜欢这样。 如何提高效率?是否有更好的方法来创建我需要的表格?
编辑:
关于这个问题一周的思考终于给了我一些答案。这很简单!
我对 Column 对象类进行了一些修改。以前,我的代码遍历了数据库中 celldata 表的所有可能条目。现在 Column 对象获取 celldata 的数组,其中 columnid的匹配,我只能使用该数据进行比较。
$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>";
更快,虽然仍然是强制性的,但数据量较少。当然,现在的问题是 Column 对象可能会执行大量的MySQL查询,具体取决于列的数量。
答案 0 :(得分:1)
如果您确保通过加入表并在查询中指定$alldata
子句,在ORDER BY
中正确排序从MySQL获取的数据:
SELECT data.*
FROM data RIGHT JOIN rows USING (rowid) RIGHT JOIN columns USING (columnid)
ORDER BY rowname, columnname;
然后您只需按顺序输出每个单元格:
echo '<table>';
echo '<thead>'
echo '<tr>';
echo '<th> </th>';
foreach ($columns->getColumns() as $column) {
echo '<th scope="col">', htmlentities($column->getColumnname()), '</th>';
}
echo '</tr>';
echo '</thead>';
echo '<tbody>';
$data = $alldata->getAlldata();
foreach ($rows->getRows() as $row) {
echo '<tr>';
echo '<th scope="row">', htmlentities($row->getRowname()), '</th>';
foreach ($columns->getColumns() as $column) {
$d = each($data);
echo '<td>', ($d ? htmlentities($d[1]->getSomedata()) : ' '), '</td>';
}
echo '</tr>';
}
echo '</tbody>';
echo '</table>';
答案 1 :(得分:0)
解决此问题的最佳方法是重写$alldata
的查询,以使其符合您想要的eggyal建议的顺序。如果由于某种原因你不能这样做,你可以在开头迭代$alldata
并从中创建一个正确索引的数组。像这样:
$ordereddata = array();
foreach($alldata as $d) {
$ordereddata[$d->getCID()][$d->getRID()] = $d->getSomedata();
}
现在,您可以将此foreach($alldata)
循环替换为:
if(isset($ordereddata[$column->getID()][$row->getID()])) {
echo "<td>{$ordereddata[$column->getID()][$row->getID()]}</td>";
} else {
echo "<td> </td>";
}