【问题标题】:nested foreach loop with IF statement带有 IF 语句的嵌套 foreach 循环
【发布时间】:2017-01-13 16:48:46
【问题描述】:

数据库表:

电影(id_film PK,名称)

流派(id_genre PK,名称)

film_genre(id_film FK, id_genre FK)

这会输出流派表中的所有流派:

$genremenu = $veza -> prepare("select * from genre");
$genremenu -> execute();
$resultmenu = $genremenu -> fetchALL(PDO::FETCH_OBJ);

这会从特定电影的 film_genre 表中输出所有选定的流派:

$izraz = $veza -> prepare("select * from genre a inner join film_genre b on a.id_genre=b.id_genre where b.id_film=:id_film");
$izraz -> execute(array("id_film" => $film -> id_film));
$selectedgenre = $izraz -> fetchAll(PDO::FETCH_OBJ);

我在将数据从数据库输出到表单中的多个选定列表时遇到问题。这是一个电影数据库,我正在进行 foreach 迭代以读取所有电影类型行以输出到多个选择字段。但是我在将“选定”流派输出到该列表时遇到了麻烦。代码是

foreach ($resultmenu as $line) {
    foreach ($selectedgenre as $sg) {
       if ($line-> id_genre === $sg-> id_genre) {
          echo "<option value=\"" . $line-> id_genre . "\" selected>" . $line-> name . "</option>";
        } else {
          echo "<option value=\"" . $line-> id_genre . "\">" . $line-> name . "</option>";
           }
        }

      }

现在我知道我在选定列表中得到了重复的输出,因为例如,如果电影有 2 种类型,比如说喜剧和犯罪,这意味着对于每个 $line,他将迭代两次以检查 $selectedgenre,所以我得到如下输出:

  1. 喜剧
  2. 喜剧“入选”
  3. 犯罪
  4. 犯罪“选定”
  5. 恐怖
  6. 恐怖

我是 php 新手,所以我想问如何在没有重复条目的情况下获得正确的列表输出?我尝试使用刹车并继续但不工作,或者我没有正确使用它?请帮助并提供(如果可能)更多替代解决方案。谢谢!

【问题讨论】:

  • DISTINCT 在您的 SQL 查询中将有助于对您的重复问题进行排序。至于选中的issue,var_dump($line-&gt;id_genre, $sg-&gt;id_genre);输出什么?
  • 检查这个 - if ($line-&gt; id_genre === $sg-&gt; id_genre)
  • 我更新了我的问题,所以我认为 DISTINCT 无济于事,因为我没有从一个具有不同值的表中进行选择...@JonStirling 现在从 var_dump 输出的问题中更清楚了
  • 谁能想到如何解决这个问题?请帮忙

标签: php mysql


【解决方案1】:

你需要建立一个你在电影中拥有的流派数组,然后对它们进行交叉检查。

试试这个

<?php

$genres = array();
foreach ($selectedgenre as $sg) {
   $genres[] = $sg->id_genre;
}


foreach ($resultmenu as $line) {

   if (in_array($line->id_genre,$genres)) {
      echo "<option value=\"" . $line->id_genre . "\" selected>" . $line->name . "</option>";
    } else {
      echo "<option value=\"" . $line->id_genre . "\">" . $line->name . "</option>";
    }
}

?>

【讨论】:

  • 非常感谢您的回答!这解决了我的问题,我很困惑如何只检查一次值,以免得到重复的输出! @KikiTheOne 问候!
【解决方案2】:

使用如下循环使其成为唯一数组

$out=array();
foreach ($resultmenu as $line) {
$out[$line-> id_genre]=$line;
}

使用数组之前

或在选择语句中使用distinct(id_genre) 或使用group by id_genre

或者代替 foreach 将选定的流派 id_genre 放在一个数组中,然后

foreach ($selectedgenre as $sg) {
       if ($line-> id_genre === $sg-> id_genre) {

使用 inarray 进行检查

【讨论】:

  • 我在数据库中没有重复的条目,所以我为什么要使用 distinct(id_genre)?或者我应该在哪里使用 group by... 我用数据库结构和查询更新了我的问题,所以请现在阅读,如果可能的话,请给出你的解决方案。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 2012-06-22
相关资源
最近更新 更多