2014-01-21 179 views
1

我只是想弄清楚哪一個會更好,從長遠來看,以及這兩個場景之間是否存在性能差異。多個if/else語句與foreach循環

我們正在維護網站,我們做了創建,我們正在試圖動態添加一些在某些頁面側邊欄,並試圖決定,如果有一個理由使用foreach循環或多個if/else語句。

我們將以很多以上的頁面顯示此處顯示的6個頁面,因此可能會考慮表現問題。

foreach循環是這樣的:

$rb_enabled = false; 

$RURLs = array(
    '/cambridge.php' => 'cambridge', 
    '/milton.php' => 'milton', 
    '/kitchener_waterloo.php' => 'kw', 
    '/hamilton_dundas.php' => 'hd', 
    '/oakville.php' => 'oakville', 
    '/brantford.php' => 'brantford' 
); 

foreach($RURLs as $rurl => $engine_location){ 
    if($_SERVER['REQUEST_URI'] == $ru){ 
     $rb_url == $engine_location; 
     $rb_enabled == true; 
    } 
} 

if($rb_enabled === true){ //create a div with information based on engine location } 

這個被加載到側邊欄的PHP文件的許多頁面,其中一些需要這個DIV爲它專門創建的,其他頁面需要沒有它在所有,因此$rb_enabled

是否有一個原因,foreach循環比這更好或更壞:

if($_SERVER['REQUEST_URI'] == '/cambridge.php'){ $rb_url = 'cambridge'; $rb_enabled = true; } 
else if($_SERVER['REQUEST_URI'] == '/milton.php'){ $rb_url = 'milton'; $rb_enabled = true; } 
else if($_SERVER['REQUEST_URI'] == '/kitchener_waterloo.php'){ $rb_url = 'kw'; $rb_enabled = true; } 
else if($_SERVER['REQUEST_URI'] == '/hamilton_dundas.php'){ $rb_url = 'hd'; $rb_enabled = true; } 
else if($_SERVER['REQUEST_URI'] == '/oakville.php'){ $rb_url = 'oakville'; $rb_enabled = true; } 
else if($_SERVER['REQUEST_URI'] == '/brantford.php'){ $rb_url = 'brantford'; $rb_enabled = true; } 

的if語句是有點多餘與$rb_enabled,但如果有任何理由使用的一種方式比其他疑惑,即使這只是「如果你是下一個在這個項目上工作的人,你寧願接管的代碼」,如果這是唯一的原因。

也完全打開一個新的想法!

回答

5

你已經有一個數組的URI的關鍵,那麼爲什麼不使用array_key_exists()

if(array_key_exists($_SERVER['REQUEST_URI'], $RURLS)) { 
    $rb_enabled = true; 
    $rb_url = $RURLS[$_SERVER['REQUEST_URI']]; 
} 

沒有必要遍歷數組,或提供多個if或switch/case語句。這種查找的性能不會隨着URI數組大小的增加而降低(至少在理由上至少 - 如果你有一個佔用大量內存的巨大數組,這可能是一個問題)。

+0

+1因爲你擊敗了我 –

+0

我相信最終數組將會在合理的範圍內,所以我會繼續使用它。謝謝,並接受! – Xhynk

2

您應該使用switch/case語法你要求:

switch($_SERVER['REQUEST_URI']) { 
    case '/milton.php': 
     $rb_url = 'milton'; 
     $rb_enabled = true; 
     break; 

    .... 
} 
+0

當只有*沒有*可以應用的定義明確的啓發式/映射時,我只會傾向於if/switch這樣的情況。 (如果只有一些特殊情況 - 即執行額外的操作 - 我會分別處理它們。) – user2864740

+0

我曾考慮過這個問題,但它比if/else語句更多的代碼,它仍然需要循環。雖然不是一個不好的建議,但它大致與if/else一致。 +1雖然,但我會建議任何人如何處理這個使用[array_key_exists()](http://www.php.net/array_key_exists):) – Xhynk

0

一行:

list($rb_enabled,$rb_url) = ($url=$RURLs[$_SERVER['REQUEST_URI']])? array(true,$url) : null ;