2016-09-06 305 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