2010-02-27 95 views
5

我使用PHP中一個foreach環路與此類似:PHP的foreach循環效率

foreach ($class->getAttributes() as $attribute) { 
// Work 
} 

關於效率,更願意到有foreach循環外的$attributes = $class->getAttributes();聲明和迭代$attributes變量?或者$class->getAttributes()聲明只在開始時在foreach聲明中被調用一次?

(我知道這可能不是在這種情況下效率的關注,但我想知道這個原則,其他較大的情況下)

感謝,

史蒂夫

回答

15

foreach循環之外使用$class->getAttributes()並使用一個臨時變量,或者像你寫的那樣保持它不應該改變任何有關性能的內容:它仍然只會被評估一次

這裏是證明了這一點的例子:

function get_array() { 
    echo 'function called !<br />'; 
    return array(
     'first' => 123, 
     'second' => 456, 
     'last' => 789, 
    ); 
} 
foreach (get_array() as $key => $value) { 
    echo "$key : $value<br />"; 
} 

我使用的是功能,而不是一個類的方法,來獲得更短的例子,但原則是與類相同+方法。


並調用的碼本部分給出了下面的輸出:

function called ! 
first : 123 
second : 456 
last : 789 

get_array()功能只調用一次,在foreach循環的開始。

1

我沒有測試過,但我認爲做這樣的事情:

$attributes = $class->getAttributes(); 
foreach($attributes as $attribute) 
{ 

} 

更具可讀性,你可以得到的屬性後,如果您需要在foreach已經得出結論。

但是,在對您的問題的更直接回復中,getAttributes()只會在兩種情況下調用一次。

+0

+1,用於方便在循環之外訪問'$ attributes'。 – thetaiko 2010-02-27 17:43:57

2

foreach運行在內部副本:

注:除非數組是被引用,foreach指定數組的一個拷貝,而不是該數組本身運行。 [...]

所以它不會在你的情況下有任何區別。僅調用一次$class->getAttributes()來檢索數組。

1

正如其他人所說,你的例子中的功能只被調用一次。

預評估可以有所作爲的情況是for循環。

$str = 'abcdefghijklmnop'; 

//strlen will be called on every iteration 
for($i = 0; $i < strlen($str); $i++); 

//strlen will only be called once 
$len = strlen($str); 
for($i = 0; $i < $len; $i++);