2011-10-24 19 views
1

我有一个MySQL查询返回一些记录。例如:使用PHP创建基于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脚本,将创建一个无序的HTML列表对于阵列中定义的每个group

  • 如果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> 

上,使这项工作的最佳方法任何帮助吗?

回答

1

这是一个有点janky,我认为可能有一些方法来增加效率,但它当然有效。

<?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>'; 
} 
?> 
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文章并修补该示例代码,以确保您了解它如何工作。

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中组合在一起并输出这些组的可读性会更高,如其他答案中所示。

+0

很好的回答。我也曾经遇到过这种情况。我只使用了多个while循环。这应该是更高效的方式。 – bozdoz

0

我认为有三个while循环可能会更好。 SELECT * FROM表WHERE'Group'='Red',然后SELECT * FROM表WHERE'Group'='Green',然后SELECT * FROM表WHERE'Group'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); 
?> 

然后再为绿色等。它可以比将每个值保存到一个数组,然后运行一个foreach循环来调用它们更节省时间。也许不会。尝试一下,找出答案。

相关问题