2012-06-27 53 views
3

以下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命令;但它似乎并不奏效。

+0

中断后,语句不会执行 –

+0

'break'的整点是它退出循环。执行后永远不会立即到达该行。 – JJJ

回答

2

严格来说,你并不需要引入额外的变量和检查,以做到这一点。

保持简单,你可以一次外检查的for循环变量$ num_tries值的for循环:

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

您也可以在for循环中可用的$状态变量。

if($status!=0).... 
1
$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 
    } 
+0

为什么变量?难道你不能只在'break'之前放置代码(代替'$ success = true;')吗? – JJJ

+0

这就是我喜欢编程的方式。这样我可以在代码中进一步重用变量,如果事情成功的话我需要多次提供某种反馈。 – Tschallacka

+3

为什么不使用状态变量? –

0

一个break语句导致循环打破,而突破后发生时,回路中的任何代码被跳过。

也许,你可以做这样的事情:

$success = false; 

for($num_tries = 0 ; $num_tries < 4 ; $num_tries++) { 

    if (success()) { 
     // do something 
     $success = true; 
    } 
} 

echo ($success) ? 'Success' : 'Failure'; 
1

尝试这样做:

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语句,以停止脚本的其余部分。

+0

我需要一些睡眠,忘记我提到的“根本缺陷”,将其编辑出来,出于某种原因,我似乎忽略了“继续”的说法。不过,我觉得我的建议是有效的,而且是一种更加优雅的方法 –

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; 
} 
?>