为具有特定值</div>的所有MySQL php结果创建唯一的单个<div>元素

时间:2012-07-12 17:16:29

标签: php mysql for-loop nested-loops

这是我的问题。我从mysql数据库返回结果并使用for循环来回显结果。虽然它变得有点复杂,因为我使用一些表数据嵌套在其他结果中。这段代码在一个名为“西班牙”的div中返回“Pablo Picasso”,很好,但如果西班牙也有“El Greco”,那么我会得到两个“西班牙”div,而不仅仅是那个。

所以:我只想为表列中的每个唯一值返回一次结果,而不是每一个都返回一次。

$results = array();
while ($row = mysql_fetch_assoc($result)) {
$results[] = $row;
}

foreach ($results as $row)
    {
    echo "<div class=\"".$row['country']."\">".$row['country'];
    echo "<div class=\"Box\">";
    $tempCountry = $row['country'];

    foreach ($results as $row)
    {
    if ($row['country']== $tempCountry) echo "<div>artists name</div>";
    }

    echo "</div>";echo "</div>";
}

我想知道它是否是嵌套循环的构造,或其他什么,我不知道!请帮忙

3 个答案:

答案 0 :(得分:1)

我同意@Kalpesh您需要按国家/地区订购结果。

现在你有多个嵌套循环,而你真正需要的只是一个。尝试只使用一个循环来浏览数据。在每次迭代时,检查$ tempCountry值以查看它与当前行的国家/地区是否不同。如果是,则需要关闭当前<div>,打开新的<div>并更新$ tempCountry值。否则,请回显艺术家的名字。

编辑:下面添加了Psuedocode

  • 从数据库中检索数据(查询应按国家/地区对数据进行排序)
  • 将$ tempCountry初始化为null
  • 遍布每一行
    • 如果$ tempCountry等于此行的国家/地区
      1. 打印艺术家
    • 否则
      1. 将$ tempCountry设置为等于此行的国家/地区
      2. 关闭div标签
      3. 打开一个新的div标签
      4. 打印艺术家

请注意,您不希望第一次通过循环关闭div标记。此外,您需要在循环结束后关闭div标记。

foreach ($results as $row) {

    if ($tempCountry == $row['country']) {

    echo "<div class=\"Box\">";

        echo "<div>artist</div></div>";

    }

    else {

        $tempCountry == $row['country'];

        echo "</div><div class=\"".$row['country']."\">".$row['country'];

        echo "<div class=\"Box\">";

        echo "<div>artist</div></div>";

    }

    echo "</div>";

}

答案 1 :(得分:0)

在循环外创建一个空数组。在输出时将$ row的值推入循环内的数组中。然后仅在数组中尚不存在值时输出。您可以使用in_array

答案 2 :(得分:0)

我找到的解决方案是将foreach嵌套在另一个中,外部循环SELECTS与GROUP BY。 在这个示例中,我为每个国家/地区获得一个外部,然后在该国家/地区内(或该列值)中的每个人(或项目)。真有用。

新代码:解决方案(使用GROUP BY构建外部容器)

// create array to build group div
$country = mysql_query("SELECT * FROM table GROUP BY `country`");
// create array for inner contents
$result = mysql_query("SELECT * FROM table ORDER BY name"); 

//array for group(countries in this instance)
$countrys = array();
while ($row = mysql_fetch_assoc($country)) {
$countrys[] = $row;
}
//array for inner contents
$results = array();
while ($row = mysql_fetch_assoc($result)) {
$results[] = $row;
}

$tempCountry="";
foreach ($countrys as $row)
    {   
    $tempCountry = $row['country'];

    echo "<div class=\"".$row['country']."\">";
    echo $row['country'];
    echo "<div class=\"Box\">";
    foreach ($results as $row) {
    if ($tempCountry == $row['country'])
    {
    echo"<div>inner contents of that group</div>";
    }
    }
    echo "</div>";
    echo "</div>";
    }