基本的PHP MySQL数组分组问题

时间:2010-01-05 00:12:40

标签: php mysql arrays foreach

快速提问,我认为对于那些拥有超过PHP / MySQL最基本知识的人来说,这是一个非常简单的解决方案。

我有一个存储在数据库中的各种状态的城市列表,其中包含城市,州和其他一些变量。现在,他们被拉成一个按城市名称排序的列表:

  • 安克雷奇,AK
  • Baltimore,MD
  • 伊利诺伊州芝加哥市 等等。

我希望能够先按州分组,然后列出所有具有该州值的城市。所以它看起来像:

AK

  • 安克雷奇
  • 朱诺

CA

  • 洛杉矶
  • 圣地亚哥
  • 旧金山
  • 等等

我知道我需要做一些foreach并在线搜索,但还没有找到一个我可以开始工作的例子。

以下是我必须提取的基本清单:

  $list = mysql_query("SELECT id, alphaname, state FROM regional ORDER BY alphaname",$db);

while ($thearray = mysql_fetch_array($list)) {
  echo "<li><a href='info.html?id=$thearray[id]'>$thearray[alphaname], $thearray[state]</a></li>";
  } 

我知道如何做的唯一真正的方法是为每个状态运行一个查询,这将是一个痛苦而且完全是愚蠢的......

感谢您的帮助!

更新 - 已解决。虽然i-g工作得很好,但我还是选择了rockacola的方法。

4 个答案:

答案 0 :(得分:4)

试试这个..

查询所有具有州的城市,先按州按顺序查询,然后按城市查询:

SELECT id, alphaname, state 
FROM regional 
ORDER BY state ASC, alphaname ASC

将数据集整理为二维数组:

$states = array();
while($thearray = mysql_fetch_array($list)) 
{
    $states[$thearray[state]][$thearray[id]] = $thearray[alphaname];
} 

现在$states的内容应该类似于:

Array
(
    [AK] => Array (
        [id_1] = Anchorage
        [id_2] = Juneau
    )
    [CA] => Array (
        [id_3] = Los Angeles
        [id_4] = San Diego
        [id_5] = San Francisco
    )
)

生成HTML演示文稿:

注意:添加锚点以反映建议的问题。

foreach($states as $state_name => $cities)
{
    echo '<h3>'.$state_name.'</h3>';
    echo '<ul>';
    foreach($cities as $id => $city_name)
    {
        echo '<li><a href="info.html?id='.$id.'">'.$city_name.'</a></li>';
    }
    echo '</ul>';
}

答案 1 :(得分:1)

更新您要使用的SQL查询:

ORDER BY state, alphaname

这将使您的数据库返回结果为:

state   city
------------------
AK      Anchorage
AK      Juneau

...假设在示例中使用SELECT state, alphaname AS city

演示必须用PHP处理:

//Please excuse my hideous attempt at PHP.  Better to think of it as Psuedo code
while ($thearray = mysql_fetch_array($list)) {
  echo $thearray[state]
  echo "<li><a href='info.html?id=$thearray[id]'>$thearray[alphaname]</a></li>";
}

...或者您可以查看i-g的帖子。

答案 2 :(得分:0)

按州排序所有行。然后,按顺序遍历所有行。在第一行以及状态与上一行不同的任何行上,在输出城市名称之前输出状态名称。

答案 3 :(得分:-2)

SQL不会返回超过2维的数据。你想要的是获得某种枢轴列。您的问题的答案是使用以下内容获取所有行:

SELECT * FROM regional ORDER BY state;

然后使用PHP(或您选择的语言)进行排序和分组,但不使用SQL。