使用IF语句嵌套的foreach循环

时间:2016-09-06 09:29:08

标签: php mysql

数据库表:

电影(id_film PK,名字)

genre(id_genre PK,name)

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个类型,让我们说喜剧和犯罪,这意味着每个$行他将迭代两次以检查$ selectedgenre,所以我输出如下:

  1. 喜剧
  2. 喜剧“选中”
  3. 犯罪
  4. 犯罪 “选择了”
  5. 恐怖
  6. 恐怖
  7. 我是php新手,所以我问如何获得没有重复条目的正确列表输出?我试过制动并继续但不工作或我没有使用它?请帮助并提供(如果可能的话)更多替代解决方案。谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

使用数组之前

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

或代替foreach将selectedgenre id_genre放入数组并

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

使用inarray进行检查

答案 1 :(得分:2)

你需要在电影中建立一个你已经拥有的类型阵列,然后用它们进行交叉检查。

试试这个

<?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>";
    }
}

?>