Foreach,for循环PHP冗余

时间:2016-09-22 14:38:52

标签: php mysql loops for-loop foreach

我有以下代码:

<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>,其中显示以前未与用户关联的书籍。在这种情况下,$ array保存已经链接到该用户的书籍的ID。

我知道问题是嵌套循环,因为我得到了我想要的结果,例如(对于$ row = 3和$ i = 2):

Book1
Book1
Book2
Book2
Book3
Book3

期望的结果将是:

Book1
Book2
Book3

但我无法弄清楚如何在没有嵌套循环的情况下比较Id。

2 个答案:

答案 0 :(得分:1)

而不是你的for-loop

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

即使$ array多次包含$ id,也只会写一次。

编辑:忘记!否定。条件。

答案 1 :(得分: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;
                }
            }
        }