2014-04-30 43 views
1

我有幾個工作while循環在我的功能,但這一個我只是不能工作,因爲它應該。我認爲while($variable == false)會在$variable = true;發生時立即跳出循環。這是一個純粹的骨骼版本,循環中只有兩條語句。雖然循環沒有打破條件時

$excluded = false; 
while($excluded == false): 
    $excluded = in_array(strtolower($extension), $GLOBALS['codexts']) ? true : false; 
    $excluded = $file != "." && $file != ".." ? false : true; 
    break; 
endwhile; 

在循環中,第一個定義確實產生false時,它的假設,但循環不破。它繼續到第二個,它返回true。如果我改變了第二個這樣:

$excluded = $excluded ? $excluded : ($file != "." && $file != ".." ? false : true); 

...然後我得到我想要的結果,但這只是因爲我糾正while循環未能打破時$excluded首先被定義爲true 。我在這裏做錯了什麼?

UPDATE 我剛重讀手冊,顯然我錯過這部分:

表達式的值在循環的開始,每次檢查,因此,即使該值發生變化時執行嵌套語句,直到迭代結束纔會停止執行。

這就是爲什麼迭代恢復爲假的原因。畢竟,我確實需要手動進行有條件的休息。

+0

你確定它進入到第二循環?你的'break;'語句沒有圍繞它的條件,無論你的'$ excluded'是真還是假,它都會被執行。 –

+0

丟失大括號..... –

+0

break語句位於循環結尾,以覆蓋那些永不會返回true的迭代,因此循環不會卡住。但我向你保證,有些迭代在第一個語句中返回true,但不是表現得像他們是真實的,因此這就是我知道它正在發生的第二條語句。最後的休息不是問題。 –

回答

2

嘗試

$excluded = false; 
while($excluded == false) { 
    $excluded = in_array(strtolower($extension), $GLOBALS['codexts']) ? true : false; 
    if ($excluded == true) { 
    break; 
    } 
    $excluded = $file != "." && $file != ".." ? false : true; 
    break; 
} 
?> 
+0

爲什麼要投票? –

+0

花了我一分鐘,看看有什麼不同。大括號。那麼,我試過了。還是行不通。不過謝謝。 –

+0

順便說一句:Downvote不是我。 –

0

問:爲什麼不使用使用常規語法?

問:爲什麼多餘的「休息」?

問:爲什麼在測試之前設置了兩次表達式,您是否真的需要「?:」在這裏?兩次???問:你不能簡化改變你的標誌的表達式嗎(改變「$ excluded」)嗎?

建議:

$myvar = false; 
while(!$myvar) { 
    $myvar = << something that sets/clears my flag >> 
} 
+0

問:我的語法的哪一部分是非常規的? 答:break語句是在循環結尾,以覆蓋那些永遠不會返回true的迭代,所以循環不會卡住。這是標準協議。它不是多餘的。問:我不明白你的第三個問題:「在測試前設置表達式兩次。」 –

+0

它不會比'如果in_array()true/false'簡單得多。 –

+0

而你的建議正是我所做的。 '!$ myvar'與'$ myvar == false'相同,並且在發佈之前我多次試過'!$ excluded'。 –