2009-12-24 64 views
1

我正在做的是在數組上循環並在數組的每個值上運行函數(該函數在成功時返回true,在錯誤時返回false)。如果循環內的任何調用返回false,我想返回false,但我希望處理整個循環。在循環中獲取函數的整體返回值

可能更容易用代碼來解釋:

foreach($this->_cacheLocations as $cacheId) 
{ 
    $this->deleteCache($cacheId); 
} 

return true/false depending on whether anything failed above; 

我不希望引入一個變量,如果能夠保持任何falses的軌道。例如,我不希望做到以下幾點:

$result = true; 
foreach($this->_cacheLocations as $cacheId) 
{ 
    $_result = $this->deleteCache($cacheId); 
    if(!$_result) $result = false; 
} 

return $result; 

有一個奇特的辦法做到這一點,或者我應該只是做了第二個方法是什麼?

+0

沒有做到這一點更簡單的方法,除了像帕斯卡的單個變量。 – wallyk

回答

2

爲了一起跟蹤多個返回結果,您不幸的是需要一個變量。如果您不希望它成爲循環範圍內的局部變量,則可以創建一個由deleteCache()設置的對象屬性,但除非其他函數也使用它,否則局部變量是最乾淨的解決方案。

假設$this->deleteCache()總是返回truefalse,你可以縮短它到是這樣的:

$result = true; 
foreach($this->_cacheLocations as $cacheId) 
{ 
     $result = $this->deleteCache($cacheId) && $result; 
} 
return $result; 
+0

謝謝,這肯定比我有的要乾淨。 –

+1

請注意,在大多數語言中,'&&'操作符會短路,所以在第一個「false」值後,循環將不再調用該函數。 – Javier

+0

傑維爾,你是正確的。我扭轉了操作的順序來修復它。謝謝。 – zombat

3

我會用一個變量,就像你在第二部分代碼中一樣 - 至少,這就是我在這種情況下所做的。


如果你想消除一個臨時變量,你可以使用:

$result = true; 
foreach($this->_cacheLocations as $cacheId) 
{ 
     if (!$this->deleteCache($cacheId)) { 
      $result = false; 
     } 
} 
return $result; 

但這個想法是一樣的,你什麼張貼。

+0

表示同意,沒有圍繞這一個黑客。 –

+0

一個很好的答案。謝謝。 –

+0

不客氣:-)玩得開心! –