【问题标题】:Looping through a JOIN'ed MySQL Associative Array循环通过 JOIN'ed MySQL 关联数组
【发布时间】:2011-01-23 22:54:22
【问题描述】:

好的,所以我有一个如下所示的查询:

$bestof_query = "SELECT * FROM physicians p JOIN (awards a, categories c, awardLevels l) ON (a.id = p.id AND c.id = a.category AND l.id = a.level) ORDER BY a.category, a.level ASC ";
$query = mysql_query($bestof_query);

while($result = mysql_fetch_array($query)) {
 extract($result);
 echo "<h3>" . $category . "<h3>";
   foreach($category as $value) {
       echo "<h5>" . $name . "<h5>" . "<p>" . $description . "</p>" . "\r\n";
   }
}

一个典型的结果看起来像-

Array (
 [0] => 39  [id] => 1
 [1] => William�B.�Poff [name] => William�B.�Poff
 [2] => 10 South Main Street [address1] => 10 South Main Street
 [3] => Tower A, Suite 1400 [address2] => Tower A, Suite 1400 
 [4] => Jackson [city] => Jackson 
 [5] => VA [state] => VA
 [6] => 24111 [zip] => 24111
 [7] => downtown-jackson [neighborhood] => downtown-jackson
 [8] => 5409837649 [phone] => 5401111111
 [9] => http://www.foo.com [uri] => http://www.foo.com 
 [10] => Foo�Rogers,�PLC [firm] => Foo�Rogers,�PLC
 [11] => 39 
 [12] => 1 [category] => Bankruptcy
 [13] => 1 [level] => 1 
 [14] => 2009 [year] => 2009 
 [15] => 1 
 [16] => Bankruptcy 
 [17] => 1 
 [18] => Platinum [description] => Platinum )

我正在尝试根据[category]进行循环,当category等于Bankruptcy时,输出所有的破产结果,然后进入下一个类别。

这有意义吗?我从来都不是很擅长循环,所以提前感谢!

我希望的是-

<h3>$category</h3>
<ul>
<li>$name - $description</li>
<li>$name - $description</li>
<li>$name - $description</li>
<li>$name - $description</li>
</ul>

然后迭代到下一个类别。我认为是嵌套循环,但我不确定如何执行嵌套循环。

【问题讨论】:

    标签: php mysql arrays foreach while-loop


    【解决方案1】:
    $query = "SELECT * FROM physicians p JOIN (awards a, categories c, awardLevels l) ON (a.id = p.id AND c.id = a.category AND l.id = a.level) ORDER BY a.category, a.level ASC ";
    $query = mysql_query($query);
    
    while($row = mysql_fetch_assoc($results)) { 
          $categories[$row['category']][] = $row;
    }
    
    foreach($categories as $key=>$value){
        echo"<h3>$key</h3>\r\n";
        echo "<div><ul>\r\n";
        foreach($value as $physician){
        echo "  <li>".$physician['name']." - ".$physician['description']."</li>\r\n";
        }
        echo "</ul></div>\r\n"
    }
    

    【讨论】:

    • 我从未使用过 GROUP BY .. 但在快速测试中,我认为我没有正确使用它,因为现在我只得到 37 个结果,而不是像以前那样获得 200 多个结果。我试过这个:SELECT * FROM 医生 p JOIN (awards a, category c, AwardLevels l) ON (a.id = p.id AND c.id = a.category AND l.id = a.level) GROUP BY a。类别
    • 这不是我已经在做的事情:“ORDER BY a.category, a.level ASC”吗?我的问题是如何完成循环,我认为我的 MySQL 是否正确?
    • 嗯,输出一切是的,但我认为我需要一个嵌套循环,以便我可以输出类别,然后循环该类别中的名称,然后移动到下一个类别。我将编辑原始帖子以说明我的意思。
    • hmm...这不起作用,它正在输出:
      • 3 - 3
      • R - R
      • 1 - 1
      • S - S
      • R - R
      • V - V
      • 2 - 2
      • o - o
      • 2 - 2
      • U - U
      • -
      • U - U
      • 3 - 3
      • 2 - 2
      • S - S
    • 你能给我看看 print_r($categories);在 foreach 循环之前
    【解决方案2】:

    您需要一个简单的状态机。这是一种在不执行真正嵌套循环的情况下执行嵌套循环的方法。尤其是数据流是一维的。

    $category = '';
    while( $result = mysql_fetch_array($query) ) {
        if( $result['category'] != $category ) {
            $category = $result['category'];
            echo "<h3>".$category."</h3>\n";
        }
    
        echo "<h5>".$result['name']."</h5>\n";
        echo "<p>".$result['description']."</p>\n";
    }
    

    如果您将每个组作为一个整体进行标记,它会变得更加复杂,但这是基本思想。它依赖于这样一个事实,即同一类别中的所有内容都在一起,您可以通过 ORDER BY 实现这一点。

    P.S:不要使用extract();它会污染你的命名空间。

    【讨论】:

    • 谢谢,非常感谢您的帮助。我会牢记关于 extract() 的建议。虽然这很方便,但我明白你的意思,尤其是在处理多个结果集时,我猜对吗?
    • 如果我想将结果(不是条件 if 输出)包装在
      中怎么办?就像直接在

      之前一样,我可以放置开头
      但我将如何处理

    • 你稍微扩展了状态机。您可以在打开下一个
      之前轻松关闭
      ,但是您必须记住两件事:在循环结束时关闭最后一个并在循环开始时打开一个“虚拟” .如果你愿意的话,你可以用变量来减少它。
    • 对这种循环的另一个主要改动是将终止检查移到循环的中间。恐怕在这个例子中如何做到这一点并不明显。但是一旦你开始复制代码,请记住这种可能性,因为它会为部分问题提供一个非常优雅的解决方案。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签