【问题标题】:Basic PHP MySQL array grouping question基本的 PHP MySQL 数组分组问题
【发布时间】:2011-01-01 11:25:41
【问题描述】:

快速的问题,我认为对于像我一样具备 PHP/MySQL 最基本知识的人来说,这是一个非常简单的解决方案。

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

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

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

AK

  • 锚地
  • 朱诺

加拿大

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

我知道我需要做一些 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 的方法。

【问题讨论】:

    标签: php mysql arrays foreach


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      SELECT * FROM regional ORDER BY state;
      

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

      【讨论】:

      • 与数据透视无关,您的ORDER BY与OP提供的相同。
      【解决方案3】:

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

      【讨论】:

      • 是的,我也会推荐这种方法。
      【解决方案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>';
      }
      

      【讨论】:

      • 我比 ig 更喜欢这种方法,因为它可以更好地将表示与数据检索和处理分开,但我认为 $tharray[id] 不会有任何内容,因为您的 select 语句仅询问名称和状态。你仍然可以使用 $states[$thearray[state]][] = $thearray[alphaname];并留下ID。 (就输出而言,可以像 i-g 那样使用列表列表。)
      • @sprugman,感谢您的更正。我应该从查询中选择 id,因为 ID 使用是@Voodoo 要求的一部分。是的,$states[$thearray[state]][] 也可以将 ID 排除在外。
      • @sprugman我使用 ID 作为变量来创建链接,所以我确实包含了它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多