while循环省略每四个结果

时间:2013-11-16 01:32:57

标签: php

我尝试动态生成包含数据库数据的HTML表。输出看起来很完美,但经过仔细检查,我意识到它省略了每四个结果。我知道它与我的while循环结构和if / else语句有关,但我不确定它究竟是什么。

$i=0;
while ($person = $pull_person->fetch()){
    if ($i <= 2){
        echo "<td valign='top'>";
        echo "<h3>" . $person['person_name'] . " - " . $person['person_id'] . "</h3>";
        echo "<label style='background-image:url(" . $person['person_pic'] . ");'><input type='checkbox' name='person[]' value='" . $person['person_id'] . "''></label>";
        echo "</td>";
        $i++;
        }
    else{
        echo "</tr>";
        echo "<tr>";
        $i=0;
        }               
}

它必须是简单/明显的东西,但它没有注册我。谢谢!

3 个答案:

答案 0 :(得分:3)

由于循环限制逻辑,循环没有达到第四个结果。

$i=0;
while ($person = $pull_person->fetch()){
    if ($i <= 2){
        echo "<p>item: $i</p>";
        $i++;
    }    
}

迭代1:$ i = 0

迭代2:$ i = 1

迭代3:$ i = 2

迭代4:$ i = 3

迭代4永远不会被命中,因为它会检查并看到$ i必须小于或等于2. 如果将其更改为小于或等于3,它将按您的意愿工作

    if ($i <= 3)

答案 1 :(得分:1)

显然......只有在满足条件时才增加变量$i

$i=0;
while ($person = $pull_person->fetch())
{
    if ($i <= 2)
    {
        //output
        $i++;
    }
else
    {
        //no output
        $i=0;
    }
}

所以这发生了:

iteration    old $i    new $i    output
    1           0         1        yes
    2           1         2        yes
    3           2         3        yes
    4           3         0        no    //condition not met
    5           0         1        yes   //loops...
   ...

您在此处观察到的是,代码将跳过条件函数2中的数字给出的迭代输出。因此,例如,如果使用条件$i <= 3,结果为:

iteration    old $i    new $i    output
    1           0         1        yes
    2           1         2        yes
    3           2         3        yes
    4           3         4        yes
    5           4         0        no    //condition not met
    6           0         1        yes   //loops...
   ...

如果要在每n次迭代中插入一些内容,请执行以下操作:

$n = 3; //number of items per row
$i = 0;
while ($person = $pull_person->fetch())
{
    //output item
    $i++;
    if ($i == $n)
    {
        //something each $n iterations
        $i=0;
    }
}

效果如下(假设$ n = 3):

iteration    old $i    new $i    new row
    1           0         1        no
    2           1         2        no
    3           2         0        yes   //condition is met, $i reset to 0
    4           0         1        no
    5           1         2        no    
    6           2         0        yes   //condition is met, $i reset to 0
   ...

注1:每次迭代都会输出一个项目。

注2:您可以调整i的初始值以获得偏移量。

答案 2 :(得分:0)

误读问题,但会留下答案,因为它可能会提供用途。

最好的方法是将数组视为“模块”(数学上) - 即使用模块化算术:

if ((i % 4) == 0)

也就是说,指数0,4,8,12,16 ......将仅作为目标。实际上,这就是大多数setInterval函数在幕后工作的方式。