我尝试使用PHP输出动态表,如下所示:
Paul 56
Paul 6
Paul 78
Paul 34
Paul 76
Mark 56
Mark 5
Mark 34
Mark 87
Mark 23
Mark 765
基本上我想输出的是这样的:
<table>
<tr colspan="2">Name: Paul</tr>
<tr><td>56</td><td>Edit</td></tr>
<tr><td>6</td><td>Edit</td></tr>
<tr><td>78</td><td>Edit</td></tr>
<tr><td>34</td><td>Edit</td></tr>
<tr><td>76><td>Edit</td></tr>
<tr colspan="2">Name: Mark</tr>
<tr><td>56</td><td>Edit</td></tr>
<tr><td>5</td><td>Edit</td></tr>
<tr><td>34</td><td>Edit</td></tr>
<tr><td>87</td><td>Edit</td></tr>
<tr><td>23/td><td>Edit</td></tr>
<tr><td>765/td><td>Edit</td></tr>
</table>
到目前为止我的PHP代码是什么样的:
<?php
$name_holder = null;
for($i=0;$i<count($data);$i++) {
if($name_holder != $data[$i]->name){
$name_holder = $data[$i]->name;
//not sure what to do here??
}
echo "<tr>";
echo "<td align='left'>".$data[$i]->name."</td>";
echo "<td align='left'>".$data[$i]->hour."</td>";
echo "</tr>";
}
?>
SQL
SELECT name,hour FROM checkin_tbl GROUP BY name ORDER BY name ASC;
答案 0 :(得分:2)
您无需在数据库级别对数据进行分组。可以这样做,但是对于每个组,您需要另一个SELECT
来读取相关数据,并且会导致过多的查询被发送到数据库。
我因此选择使用直接查询来读取数据,这将是这样的:
SELECT name,hour FROM checkin_tbl ORDER BY name ASC;
我没有提供下面的数据库代码,因为不清楚您使用的是什么数据库(例如MySQL)或您正在使用的接口(例如PDO)。因此,我使用数组模拟了一个数据源 - 我相信你可以用fetchAll()
或foreach()
和行fetch()
来交换它。
因此,尝试这样的事情:
<?php
// Data from your database
$rawData = [
['Paul', 56],
['Paul', 6],
['Mark', 56],
['Mark', 5],
];
// Let's reformat this
$out = [];
foreach ($rawData as $pair)
{
$name = $pair[0];
if (!isset($out[$name]))
{
$out[$name] = [];
}
// Pop the value on the list
$out[$name][] = $pair[1];
}
// Use this to look at your structure
#print_r($out);
?>
<!-- Here's your rendering section -->
<?php foreach ($out as $name => $data): ?>
<tr colspan="2"><td>Name: <?php echo htmlentities($name) ?></td></tr>
<?php foreach ($data as $item): ?>
<tr><td><?php echo htmlentities($item) ?></td><td>Edit</td></tr>
<?php endforeach ?>
<?php endforeach ?>
我的策略是尽可能在模板外部格式化数据 - 您的代码和其他答案(在撰写本文时)在我看来过度混合逻辑和布局,您需要将它们分开。
这就是我在渲染部分切换到打开/关闭PHP标签的原因:这是广泛使用PHP片段的HTML,需要动态输出。如果您这样做,您将从IDE中的标记匹配和语法着色中受益。
我已添加htmlentities()
以防止XSS。
答案 1 :(得分:1)
考虑到所需的情况,完全不需要GROUP BY。 实际上,这实际上阻碍了您显示给定人员的所有记录。你最终会以每人一行结束,并填写该人的最后一条记录。
为了获得您想要的情况,请删除GROUP BY。 PHP解决方案可能是。
$name_holder = null;
for($i=0;$i<count($data);$i++) {
if($name_holder != $data[$i]->name){
$name_holder = $data[$i]->name;
echo "<tr><td colspan='2'>Name: " . $name_holder . "</td></tr>"
}
echo "<tr>";
echo "<td align='left'>".$data[$i]->hour."</td>";
echo "<td align='left'>edit</td>";
echo "</tr>";
}
你正在顺利找到正确的解决方案。
这里有一个很好的解释:http://www.tutorialspoint.com/sql/sql-group-by.htm 可以在w3schools演示数据库中测试无法运行的演示:http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_groupby
所有记录:
SELECT CustomerId, ShipperId FROM [Orders] WHERE ShipperId = 1
分组:
SELECT CustomerId, ShipperId FROM [Orders] WHERE ShipperId = 1 GROUP BY ShipperId