我有一个MySQL查询,返回许多记录。例如:
+-------+------------+-----------+
| group | first_name | last_name |
+-------+------------+-----------+
| Red | John | Doe |
+-------+------------+-----------+
| Red | Jane | Doe |
+-------+------------+-----------+
| Green | Bob | Anybody |
+-------+------------+-----------+
| Black | Betty | Anybody |
+-------+------------+-----------+
我还在PHP数组中定义了几个group
名称:
$importantGroups = array('Red', 'Blue', 'Green');
使用查询结果,我正在尝试编写一个PHP脚本,它将为数组中定义的每个group
创建一个无序的HTML列表。
group
没有出现在任何查询结果中,则不会创建该列表。group
没有出现在数组中,则最后会将其放在ul中。使用上面的查询结果,HTML输出将是:
<ul id="Red">
<li>John Doe</li>
<li>Jane Doe</li>
</ul>
<ul id="Green">
<li>Bob Anybody</li>
</ul>
<ul id="Other">
<li>Betty Anybody</li>
</ul>
有关最佳方法的任何帮助吗?
答案 0 :(得分:2)
首先,在SQL中按照以下顺序进行排序:
SELECT ... ORDER BY FIELD(`group`, 'Green', 'Blue', 'Red') DESC
FIELD
的参数应按其重要性的相反顺序排列,不在此组中的结果将排序到最后。
在输出期间,只要遇到一个新组,就进入一个新组:
$group = null;
while ($row = /* get result */) {
if (!in_array($row['group'], $importantGroups)) {
$row['group'] = 'other';
}
if ($row['group'] != $group) {
if ($group !== null) {
echo '</ul>';
}
printf('<ul id="%s">', $row['group']);
$group = $row['group'];
}
printf('<li>%s</li>', $row['name']);
}
if ($group !== null) {
echo '</ul>';
}
这是大型结果集的最有效方式。如果集合不那么大,那么在PHP中将它们组合在一起并输出组就更具可读性,如其他答案中所示。
答案 1 :(得分:1)
这有点笨拙,我认为可能有某种方法可以提高效率,但它确实有效。
<?php
$importantGroups = array('Red', 'Blue', 'Green');
$sql = "SELECT * FROM `table`";
$result = mysql_query($sql);
while($row = mysql_fetch_array($result)){
if(array_search($row['group'],$importantGroups)){
$groupName = $row['group'];
}else{
$groupName = "Other";
}
$groups[ $groupName ][] = $row;
}
$importantGroups[] = "Other";
foreach($importantGroups as $groupName){
echo '<ul id="' . $groupName . '">';
foreach($groups[$groupName] as $element){
echo '<li>' . $element['first_name'] . ' ' . $element['last_name'] . '</li>';
}
echo '</ul>';
}
?>
答案 2 :(得分:1)
这是一个非常基本的脚本,您应该深入了解有关PHP和mySQL如何协同工作的更多信息,而不仅仅是寻求帮助。我将发布基本流程,以帮助您按正确的操作顺序和资源来帮助您。首先,我建议您阅读this how-to on Tizag,这有助于您全面了解这些语言如何协同工作。
查询SQL以获取所需的数据
//Connect to the database
//Query for the data
$sql = "SELECT group, first_name, last_name FROM ... WHERE ..."
$results = mysql_query($sql);
解析SQL结果以创建多维结果数组
while($result = mysql_fetch_assoc($results){
$array_of_groups[$result["group"]][] = $result;
}
遍历结果数组以创建所需的输出
foreach($array_of_groups as $group_name => $group){
//We are now looping groups
echo("<ul id='$group_name'>");
foreach($group as $item){
$item_name = $item["first_name"] . " " . $item["last_name"];
echo("<li>$item_name</li>");
}
echo("</ul>");
}
以上代码未经测试,实际上只是您需要的存根。您需要上面的测试来确定不需要哪些组。我真的会建议阅读该Tizag文章并修补该示例代码,以确保您了解它的工作原理。
答案 3 :(得分:0)
我认为有三个while循环可能会更好。 SELECT * FROM表WHERE'Group'='Red',然后SELECT * FROM表WHERE'Group'='Green',然后SELECT * FROM表WHERE'组'NOT IN('Red','Green')。每个结果都将它们放在UL标签中。
例如:
<?php
echo '<ul>';
while($row = mysql_fetch_array($result_Red))
{
echo "<li>" . $row['first_name'] . " " . $row['last_name'] . "</li>";
}
echo "</ul>";
mysql_close($con);
?>
然后再为Green和Other。它可能比将每个值保存到数组节省更多时间,然后运行foreach循环来调用它们。也许不吧。试一试,找出答案。