2016-09-22 78 views
-1

我有以下代碼:的foreach,for循環冗餘PHP

<select multiple="multiple"> 
    <?php $sql = "SELECT book_id, book_name FROM book ORDER BY book_name"; 
     try { 
      $conn = new PDO("..."); 
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

      foreach ($conn->query($sql) as $row) { 
       $myId = $row['book_id']; 
       $myName = $row['book_name']; 
       for ($i = 0; $i < count($array); $i++) { 
        if ($myId != $array[$i]) { 
         echo("<option value='$myId'>$myName</option>"); 
        } 
       } 
      } 
     } 
     catch(PDOException $e) { 
     ... 
     } 
     $conn = null; 
    ?> 
</select> 

我的目的是有選擇<select>,其中與用戶以前沒有相關的書籍出現。在這種情況下,$數組包含已經鏈接到此用戶的書籍的ID。

我知道這個問題是嵌套循環,因爲我得到的結果,我想,比如(爲$行= 3,$ I = 2):

Book1 
Book1 
Book2 
Book2 
Book3 
Book3 

和所期望的結果將是:

Book1 
Book2 
Book3 

但我想不出如何比較Id的,沒有嵌套循環。

+1

你能清楚地告訴我們您需要的輸出會是什麼給予​​一定的投入? –

+1

你能不能展示'$ array'中的實際內容,不清楚發生了什麼事以及你想要什麼。 – Styphon

+1

你在哪裏設置你的$數組?還有:你嘗試過'in_array()'嗎?它可以防止你自己循環$ array –

回答

1

,而不是你的for循環

for ($i = 0; $i < count($array); $i++) { 
        if ($myId != $array[$i]) { 
         echo("<option value='$myId'>$myName</option>"); 
        } 
       } 

嘗試in_array()instad:

if(!in_array($myId, $array)) { 
    echo("<option value='$myId'>$myName</option>"); 
} 

即使$數組包含$ ID多次,這將只寫一次。

編輯:忘了!否定。條件。

+0

也會嘗試這種方法! – anexo

1

我找到了解決辦法我自己,我不能相信我沒有打破第二個循環:,

 foreach ($conn->query($sql) as $row) { 
      $myId = $row['book_id']; 
      $myName = $row['book_name']; 
      for ($i = 0; $i < count($array); $i++) { 
       if ($myId != $array[$i]) { 
        echo("<option value='$myId'>$myName</option>"); 
        break; 
       } 
      } 
     }