2016-09-22 81 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; 
       } 
      } 
     }