【问题标题】:Create unique single <div> element for all MySQL php results with particular value为具有特定值的所有 MySQL php 结果创建唯一的单个 <div> 元素
【发布时间】:2012-07-12 12:22:30
【问题描述】:

这是我的问题。我正在从 mysql 数据库返回结果并使用 for 循环来回显结果。虽然它变得有点复杂,因为我使用一些表数据嵌套在其他结果中。此代码在名为“Spain”的 div 中返回“Pablo Picasso”,很好,但如果西班牙也有“El Greco”,那么我会得到两个“Spain”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>";
}

不知是嵌套循环的构造,还是别的什么,不知道!!!请帮忙

【问题讨论】:

  • 我正在尝试动态创建这个盒子模型:

标签: php mysql for-loop nested-loops


【解决方案1】:

我同意 @Kalpesh 的观点,即您需要按国家/地区对结果进行排序。

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

编辑:下面添加了伪代码

  • 从数据库中检索数据(查询应按国家对数据进行排序)
  • 将 $tempCountry 初始化为 null
  • 遍历每一行
    • 如果 $tempCountry 等于该行的国家/地区
      1. 打印艺术家
    • 其他
      1. 将 $tempCountry 设置为该行的 Country
      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>";

}

【讨论】:

  • 嗨,我也会尝试的 - 我同意,我认为嵌套循环过于复杂。你有你的意思的示例代码吗?还是谢谢!
  • 不幸的是,这不太奏效。艺术家的名字不再重复,但我仍然为每个艺术家得到一个父 div(国家):所以我得到 时我真的很想要。你觉得我还需要嵌套循环吗?
  • 你能发布你更新的代码吗?这并不让我觉得需要嵌套循环。
  • 问题是我需要为所有具有该值的结果(即国家/地区)构建一个 div,并将所有具有该值的行(即艺术家)嵌套在其中。然后对具有该值的所有不同行(其他国家/地区)再次循环。我担心它比我最初想象的要复杂,比如我需要一个多维数组什么的。谢谢你的帮助,顺便说一句!
  • 你离得更近了,但还不够。查看代码的第 3 行和第 5 行。请注意,if 语句将始终为真。 if 和 else 语句中的逻辑也不正确。
【解决方案2】:

在循环之外创建一个空数组。在输出时,将 $row 的值推送到循环内的数组中。然后仅在数组中不存在值时才输出。您可以为此使用in_array

【讨论】:

  • 嗨,我会试试的。你能提供一个例子来说明你的意思吗?我不确定是循环构造还是使用 foreach,但我认为 in_array 会起作用
【解决方案3】:

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

新代码:解决方案(使用 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>";
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 2022-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多