【问题标题】:exit for loop with echo退出带有回声的循环
【发布时间】:2012-06-28 13:36:20
【问题描述】:

以下 PHP 代码按预期工作。当代码无法在 4 次尝试中执行命令时,我需要回显“复制错误”消息。

for($num_tries = 0 ; $num_tries < 4 ; $num_tries++)
{
    $cloudcmd = "cp abc xyz ";
    system($cloudcmd,$status);
    if($status != 0)
    {
        sleep(3) ;
        continue ;
    }
    break ;
}

我尝试在 break 后添加 echo 命令;但它似乎不起作用。

【问题讨论】:

  • break 后语句不会执行
  • break 的全部意义在于它退出了循环。执行将永远不会到达紧随其后的行。

标签: php for-loop


【解决方案1】:
<?php  
for($num_tries = 1 ; $num_tries <=4 ; $num_tries++){  
    $cloudcmd = "cp abc xyz ";  
    system($cloudcmd,$status);  
    if($status != 0) {  
       if($num_tries!=4){  
         sleep(3);  
         continue;  
       } else {  
         echo "error";  
       }  
    }                               
    break;  
}
?>

【讨论】:

    【解决方案2】:

    尝试这样做:

    for ($num_tries=0;$num_tries < 4;$num_tries++)
    {
        system('cp abc xyz',$status);
        if ($status === 0)
        {
            break;
        }
        sleep(3);
    }
    if ($status !== 0)
    {
        echo 'error';
    }
    

    一旦$status 为0,这个循环就会中断,这意味着system() 调用成功,在循环之后,$status 值仍然可以访问(PHP 没有块范围),所以检查它的值并在需要时回显。您可以使用exit() 轻松替换echo 语句,以停止脚本的其余部分。

    【讨论】:

    • 我需要睡觉,忘记我提到的fundamental flaw,将其编辑掉,出于某种原因,我似乎忽略了continue; 声明。不过,我觉得我的建议是有效的,而且 -IMO- 是一种更优雅的方法
    【解决方案3】:

    严格来说,您不需要引入额外的变量和检查来执行此操作。

    为了简单起见,您可以在 for 循环之外检查 for 循环变量 $num_tries 的值:

    if($num_tries==4)....
    

    在 for 循环之后,您还可以使用 $status 变量。

    if($status!=0)....
    

    【讨论】:

      【解决方案4】:

      break 语句会导致循环中断,并且循环内出现在中断之后的任何代码都将被跳过。

      也许,你可以这样做:

      $success = false;
      
      for($num_tries = 0 ; $num_tries < 4 ; $num_tries++) {
      
          if (success()) {
              // do something
              $success = true;
          }
      }
      
      echo ($success) ? 'Success' : 'Failure';
      

      【讨论】:

        【解决方案5】:
        $success = false;
        for($num_tries = 0 ; $num_tries < 4 ; $num_tries++)
                {
                $cloudcmd = "cp abc xyz ";
                system($cloudcmd,$status);
                if($status != 0)
                    {
                    sleep(3) ;
                    continue ;
                    }
            $success=true;
            break ;
            }
        if($success)
            {
            //do your thing
            }
        

        【讨论】:

        • 为什么是变量?你不能把代码放在break之前(代替$success=true;)吗?
        • 这就是我喜欢的编程方式。这样,如果我需要在某件事成功的情况下多次提供某种反馈,我可以在代码中进一步重用该变量。
        • 为什么不使用状态变量?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-27
        • 2015-11-07
        • 2011-11-02
        • 2017-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多