使用动态数字作为case的switch语句的奇怪行为

时间:2017-07-05 21:03:44

标签: php while-loop switch-statement

我在PHP中的while循环中使用的switch语句中得到了非常奇怪的行为。

所以我之前用if-else if语句写了一些代码,我决定(原谅双关语)切换switch语句。

此代码尤其位于while循环内,如下所示:

<?
    $ret  = $db->query("SELECT * from teammates WHERE `current_team`='$lineID';");
    $loop = 1;
    while($row = $ret->fetchArray(SQLITE3_ASSOC)) {
        switch($loop) {
            case 5:
                echo "</div>";
                $loop = 1;
                break;
            case 1:
                echo "<div class='row'>";
                break;
            default:
                $loop++;
        }
        echo "<div class='col-lg-3'>";
        echo "  <img src='somesite.com/somepicture.png"></img>;
        echo "</div>";
        $loop++;
    }
?>

现在,此代码 正常工作 ,但是,我遇到了一些奇怪的行为,我真的很想知道它为什么会发生。

此代码拍摄一些图像,将其中的4个连续放入,然后开始一个新行,直到显示所有图像。基本上给我一个包含4列图像的页面。

正如您在我的代码中所看到的,有两个部分可以增加$loop变量。当我删除这些增量中的任何一个时,会发生奇怪的行为。

以下是一些行为图片(我很乐意提供所需的任何其他信息)

BOTH 增量:

enter image description here

缺少第二次增量:

enter image description here

缺少开关增量:

enter image description here

1 个答案:

答案 0 :(得分:1)

你算两个人。你在同一个循环中增加$loop两次。

试用简化版......

<?php
$loop = 1;

do {

    echo "$loop ";

    switch($loop) {
        case 5:
            echo "CLOSE>";
            $loop = 1;
            break;
        case 1:
            echo "<OPEN";
            break;
        default:
            $loop++;
    }

    $loop++;


} while ($loop < 50);


die('eof');
  
    
      

<OPEN2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 eof

    
  

我说重构它。请尝试使用模数函数。认为它看起来会更好。同样$loop = 0;是我喜欢在可能的情况下开始计算的东西。

看看以下内容:

$i = 0;
echo '<div class="row">';
do {
    $i++;
    echo '<div class="col-lg-3"><img src="somesite.com/somepicture.png" /></div>';
    if ($i % 5 === 0) {
        echo '</div>' . PHP_EOL . PHP_EOL; //close row - new line for readability here
        echo '<div class="row">';
    }    
} while ($i < 50);

如果不再需要更多列,您可能希望添加一个结束行div或阻止将其回显。模数%运算符是一种很好的方法,可以执行诸如遮蔽备用行,创建这样的网格或编写通常在采访中询问的"fizz-buzz"场景的方法。如果您仍然不清楚,请发表评论。

或者,具体如您提供的那样:

<?php
$ret  = $db->query("SELECT * from teammates WHERE `current_team`='$lineID';");
$loop = 0;
echo "<div class='row'>";
while($row = $ret->fetchArray(SQLITE3_ASSOC)) {
    $loop++;
    if ($loop % 5 === 0) {    
            echo "</div>";            
            echo "<div class='row'>"; //***
    }
    echo "<div class='col-lg-3'>";
    echo "  <img src='somesite.com/somepicture.png'/>";
    echo "</div>";
}
echo "</div>";
?>