2017-09-07 175 views
1

我有一系列if/elseif條件語句使用相同的結構和語法,我想清理並壓縮foreach內的代碼以更容易地添加並隨着列表的增長刪除項目。什麼我開始用看起來是這樣的:在foreach循環(PHP)中重複if/elseif

if ($condition1 == 1 && ($condition2 == 1 || $condition3 == 1)) { 
    $var = 'string 1'; 
} elseif ($condition1 == 2 && ($condition2 == 2 || $condition3 == 2)) { 
    $var = 'string 2'; 
} elseif ($condition1 == 3 && ($condition2 == 3 || $condition3 == 3)) { 
    $var = 'string 3'; 
} elseif ($condition1 == 4 && ($condition2 == 4 || $condition3 == 4)) { 
    $var = 'string 4'; 
} else { 
    $var = 'default string'; 
} 

理想情況下,我會結構本更像是:

$conditions = array(
    'string 1' => 1, 
    'string 2' => 2, 
    'string 3' => 3, 
    'string 4' => 4, 
); 
foreach ($conditions as $key => $value) { 
    if ($condition1 == $value && ($condition2 == $value || $condition3 == $value)) 
    $var = $key; 
} 
if (empty($var)) 
    $var = 'default string'; 

這裏最大的問題是,我想在第一次迭代後的所有if聲明爲elseif以防萬一滿足多個條件,所以我可以通過數組中項目的順序來控制層次結構。而且,這種方法可能完全錯誤,可能有更好的方法來完全解決這個問題,所以我願意接受任何和所有的批評!

回答

2

你可以重新排列代碼來做你所需要的。 break圈外的,如果條件滿足(「模擬」的ELSEIF條件),並在循環之前放置默認的,所以,如果沒有條件滿足時,該值將是一個:

$conditions = array(
    'string 1' => 1, 
    'string 2' => 2, 
    'string 3' => 3, 
    'string 4' => 4, 
); 
$var = 'default string'; 
foreach ($conditions as $key => $value) { 
    if ($condition1 == $value && ($condition2 == $value || $condition3 == $value)) { 
    $var = $key; 
    break; 
    } 
} 
+0

看起來像我誤解了。你不需要只滿足一個條件?如果兩個符合,所以你想爲'$ var'有兩個值? – ishegg

+0

對不起,我刪除了我的評論,但你讀得太快了。 :)您的解決方案似乎可以完美地滿足我需要的功能。欣賞它! –

+0

你確定嗎?這確實會在滿足條件後停止執行(我雖然這是你想要的)。但重新閱讀你的問題,你似乎需要多個條件相遇。 – ishegg