为什么这个循环总是产生N + 1输出?

时间:2012-10-19 11:11:09

标签: php

假设我有这样的输入:

<input type="hidden" name="block-1" value="001"/>
<input type="hidden" name="block-2" value="012"/>
<input type="hidden" name="block-3" value="002"/>
<input type="hidden" name="block-4" value="005"/>
<input type="hidden" name="block-5" value="008"/>

我希望使用这个PHP循环处理这些输入

$i = 1;

do {
    $x = 'block-'.$i;
    $webBlock = $_POST[$x];
    //some codes here
    $i++;
}

while (!empty($webBlock));

为什么我总是有6个输出?最后一个是空白输出。似乎循环总是做n + 1。如何根据给定的输入数量进行正确的循环?谢谢!

6 个答案:

答案 0 :(得分:1)

试试这个:

$i = 0;

do {
    $i++;
    $x = 'block-'.$i;
    $webBlock = $_POST[$x];
    //some codes here
}
while (!empty($webBlock));

UPD :最好的方法是:

for ($i = 1; $i <= count($_POST); $i++) {
    $webBlock = $_POST['block-'.$i];
    //some code here
}

答案 1 :(得分:1)

因为你正在使用重复循环,所以你应该使用while循环:

while (!empty($webBlock)){
    $x = 'block-'.$i;
    $webBlock = $_POST[$x];
    //some codes here
    $i++;
}

答案 2 :(得分:1)

因为表达时至少会执行一次。do while is an exit control loop.

答案 3 :(得分:1)

您需要while吗?

我会选择:

$i=0;
foreach($_POST as $name => $value)
{
   if( strpos($name , 'block-') !== false ) echo $i . " - " . $name . ": " . $value;
   $i++;
}

相信应该考虑名为“block-n”的项目。 if语句基本上表示“如果block-在字段名称中的任何位置,则回显出这样的”。 如果您收到错误并要修改,请告诉我。

答案 4 :(得分:0)

因为您使用的是Do While loop。我不确定您的数据,但我必须说它会再次按预期执行。让我们通过迭代检查它 它将首次运行,因为$webBlock不为空并且与5次相同。
现在你想要关闭循环,但你的第5次迭代的条件变为true。现在它将再次执行并且不显示任何内容(因为$ webBlock中没有任何内容)现在条件会发现$webBlock为空。
我建议你在这里使用while loop。它会解决你的问题

答案 5 :(得分:0)

我不是PHP开发人员,因此我只会让您大致了解自己在做什么。

实际上你正在使用Do-while循环,有时也称为退出控制循环。因此,如果Do-While执行代码后,将检查您的条件。所以,即使你没有在'webBlock'中获得任何价值,你的代码也会被执行。所以,这是你的错误。

而不是这个,您可以使用While循环,Entry控制循环。当且仅当条件为真时才执行代码。

$i = 1;
while (i>0) {
     $x = 'block-'.$i;
     $webBlock = $_POST[$x];
    if(empty($webBlock))
    {
      break;
   }
   $i++;
}