2010-01-05 90 views
3

快速的问题,我认为对于那些拥有PHP/MySQL最基本知识以上任何东西的人来说,这是一个非常简单的解决方案。基本的PHP MySQL数组分组问题

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

  • 安克雷奇
  • 马里兰州巴尔的摩市
  • 芝加哥,伊利诺伊 等等等等

我希望能够到然后列出所有具有该州价值的城市。所以它会看起来像:

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的方法。

回答

3

试试这个..

查询所有城市与国家,为了由国家先再由城市:

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

整理的数据集到2维数组:

$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>'; 
} 
+0

我喜欢这种方法比ig的更好,因为它更好地将数据检索和更新的表示分离出来,但我不认为$ tharray [id]将会有任何内容,因为您的select语句只会询问名称和国家。你仍然可以使用 $ states [$ thearray [state]] [] = $ thearray [alphaname];并将ID留在其中。 (就输出而言,可以使用列表清单作为i-g已经完成的情况。) – sprugman 2010-01-05 00:50:50

+0

@sprugman,感谢您的更正。我应该从查询中选择id,因为ID使用是@ Voodoo要求的一部分。是的,'$ states [$ thearray [state]] []'也可以让ID离开它。 – 2010-01-05 01:14:58

+0

@sprugmanI使用ID作为变量来创建链接,所以我确实包含了它。 – Voodoo 2010-01-05 01:15:35

0

按状态排序所有行。然后,按顺序遍历所有行。在第一行,并具有比前一行不同的状态的任何行,你输出输出城市的名字前的状态名称。

-2

SQL将不会返回超过2点维的数据。你想要的是获得某种枢轴列。回答你的问题是获取所有行:

SELECT * FROM regional ORDER BY state; 

然后进行排序,并使用PHP(或您选择的语言),但没有SQL组。

+0

与摆动数据无关,您的'ORDER BY'与OP提供的内容完全相同。 – 2010-01-05 00:32:37

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的帖子。

+0

是的,我也会推荐这种方法。 – 2010-01-05 00:33:31