Basic PHP MySQL array grouping question

扶醉桌前 提交于 2020-01-14 12:43:29

问题


Quick question, which I think has a very easy solution for someone who has anything above the most rudimentary knowledge of PHP/MySQL as I do.

I have a list of cities in a variety of states stored in a database with city, state and some other variables. Right now they get pulled as a list sorted by city name:

  • Anchorage, AK
  • Baltimore, MD
  • Chicago, IL etc etc.

I want to be able to group by state first, then list all the cities that have that state value. So it'd look like:

AK

  • Anchorage
  • Juneau

CA

  • Los Angeles
  • San Diego
  • San Francisco
  • etc etc

I know I need to do some sort of foreach and have searched online, but haven't found an example that I can get to work.

Here's what I have to pull the basic list:

  $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>";
  } 

The only real way I know how to do it would be to run a query for each state which would be a pain and totally stupid...

Thanks for any help!

Update - solved. I went with rockacola's approach though i-g's worked as well.


回答1:


Try this..

Query all city with state, order by state first then by city:

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

Organise your dataset into 2 dimension array:

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

Now contents of your $states should look something like:

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

Generate your HTML presentation:

NOTE: Add anchor to reflect proposed question.

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>';
}



回答2:


Update your SQL query to use:

ORDER BY state, alphaname

This will make your database return results as:

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

...assuming using SELECT state, alphaname AS city for the purposes of an example.

The presentation has to be handled in 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>";
}

...or you could look at i-g's post.




回答3:


Sort all rows by state. Then, traverse all rows in order. On the first row, and on any row that has a different state than the previous row, output the state name before you output the city name.




回答4:


SQL won't return more than 2 dimensional data. What you want is to get some kind of pivot column. The answer to your problem is to fetch all rows with:

SELECT * FROM regional ORDER BY state;

Then sort and group using PHP (or your language of choice), but no SQL.



来源:https://stackoverflow.com/questions/2003281/basic-php-mysql-array-grouping-question

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!