2016-09-06 262 views
4

数据库表:嵌套的foreach循环用IF语句

膜(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); 

这输出所有选择的g从表film_genre为enres特定膜:

$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,所以我要问怎么走,没有重复的条目右侧列表输出?我试着刹车,继续但不工作,或者我没有使用它的权利?请帮助并提供(如果可能)更多替代解决方案。谢谢!

+1

'DISTINCT'将排序帮助您的重复问题。至于选定的问题,var_dump($ line-> id_genre,$ sg-> id_genre);'输出是什么? –

+0

检查这个 - 'if($ line-> id_genre === $ sg-> id_genre)' –

+0

我更新了我的问题,所以我认为DISTINCT不会帮助,因为我没有从一个表中选择不同的值... @ JonStirling现在从问题更清楚var_dump输出什么 – Josip

回答

2

U需要在电影上创建一个流派阵列,然后对它们进行全面检查。

尝试在您的SQL查询本

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

?> 
+0

非常感谢你的回答!这解决了我的问题,我很困惑如何检查值只有一次,以免重复输出! @KikiTheOne问候! – Josip

2

使其通过使用循环独特的阵列如下

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

使用前阵

或SELECT语句 使用distinct(id_genre)或使用group by id_genre

或代替的foreach把selectedgenre id_genre in a array and

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

使用inarray进行检查

+0

我没有在数据库中重复的条目,为什么我应该使用distinct(id_genre)?或者我应该在哪里使用group ...我使用数据库结构和查询更新了我的问题,所以请现在阅读,如果可能,请提供您的解决方案。谢谢 – Josip