使用PHP根据MySQL结果创建无序列表

时间:2011-10-24 03:18:00

标签: php mysql html

我有一个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>

有关最佳方法的任何帮助吗?

4 个答案:

答案 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循环来调用它们。也许不吧。试一试,找出答案。