2014-09-29 33 views
0

好的,所以我知道「while」循環在開始時評估,因此並不總是運行,而「do while」循環在最後評估並始終運行,但如果我想要組合:循環評估在最後,但並不總是運行?我看不出這樣做沒有一些相當低效代碼的方式,如:PHP:最後評估循環但不總是運行一次的循環?

while($x < $y) 
    { 
    $x = $x + 100; 
    $while = "true"; 
    } 
    if($while == "true") 
    { 
    $x = $x- 100; 
    } 

...當我真的想是第一個「while」循環的迭代之前$結束期間x超過$ y。我想我也可以通過第一個「while」循環中的「if」語句來完成這個任務,但這看起來也很笨重和低效。有什麼建議麼?

+6

[這是什麼用途?](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – 2014-09-29 00:42:05

+0

我認爲這不存在,純粹是因爲它是沒用的。其他環路之一將永遠滿足您的需求。 – Nerixel 2014-09-29 00:44:45

+0

你想要做的更實際的例子可能會幫助我們更好地指導你。 – TML 2014-09-29 00:45:29

回答

1

也許你只是在尋找一種方法來「回到一個循環」?這樣做的一個簡單方法是存儲前一次迭代,並在循環體結束後恢復最後一個「先前的迭代」值。

$z = 0; 
while ($x < $y) { 
    $z = $x; 
    $x += 100; 
} 
$x = $z; 

另一個可能的選擇是明確的循環條件的意向:

while (($x < $y) and (($y-$x)>100)) { $x += 100; }

+0

謝謝!是的,我正在尋找一種「回溯到一個循環」的方法,而這段代碼似乎就是這樣做的。 – user3092995 2014-09-29 01:04:19

+1

第二個答案(或@worldofjr's)實際上可能是更好的解決方案,因爲它們都可以防止太過分(至少節省兩個步驟 - 循環迭代一次,再加上最終賦值操作)。 – TML 2014-09-29 01:06:12

2

你可以使用一個$continue布爾值。

$continue = true; 
while($x < $y && $continue) { 
    // do stuff 
    $continue = (/* some comparison such as, $y > 100 */); 
} 

不太複雜。

+1

另一個完全有效的方法;正如你所看到的,有許多方法可以在不引入新的循環構造的情況下對這隻貓進行皮膚處理。您只需要學習使用您掌握的工具從不同角度攻擊問題,而不是希望爲每項工作都有自定義工具。 :) – TML 2014-09-29 01:05:18