2017-05-23 66 views
1

我有一個很長的字符串列表稱爲$ stringfilter1 $ stringfilter2等所有的高達$ stringfilter50清理很長的if語句

我有另一個字符串$ reporteremail,我想打一個條件語句,從而方式如果任何$ stringfilter字符串存在於$ reporteremail中,則會執行一些代碼。目前我的代碼看起來像這樣,它的工作原理:

if (stripos($reporteremail, $stringfilter1) !== false || stripos($reporteremail, $stringfilter2) !== false || stripos($reporteremail, $stringfilter3) !== false [...]) { 
     runcode(); 
} 

雖然這是非常非常長的。我在這裏把它縮短了。

我想知道是否有更乾淨,更有效的方法來做到這一點?

編輯: 我正在爲bug追蹤器寫一個插件。字符串在文本框中的另一頁上輸入。我通過運行看起來像

$t_filter = plugin_config_get('filter1'); 
$stringfilter1 = string_attribute($t_filter1); 

這個功能,我會同意循環訪問數組將是最好的方式來做到這一點。如何將每個新字符串都推送到數組的末尾而無需將該片段寫出超過50次?

+1

這些'$ stringfilterX'變量來自哪裏? –

+0

這對https://codereview.stackexchange.com/會更好嗎? – ThisGuyHasTwoThumbs

+1

您應該考慮重寫$ stringfilterX vars並將它們轉換爲數組以便使它們可迭代。通過使用$$運算符並將for語句從1到N($ pattern =「stringfilter」; for($ i = 1; $ i <= N; $ i ++)遍歷它們和vars, {$ variable_name = $ pattern。$ i; print「value in variable」。$ variable_name。「:」。$$ variable_name;})但是這絕對是恐怖的東西,也是你可以寫的最髒的代碼 –

回答

1

你不需要循環。首先將所有過濾器放入一個數組中,而不是將它們放入單獨的變量中。我會嘗試通過修改輸入源而不是在PHP腳本中執行此操作。 (根據你的意見,我不確定這是否可能,所以也許你需要一個循環像另一個答案。)然後你可以使用str_ireplace檢查你的過濾器字符串在$reporteremail。 (這不會修改$reporteremail

str_ireplace($filters, '', $reporteremail, $count); 
if ($count) { 
    // run code 
} 

$count參數將包含許多替代品是如何進行的計數。如果它不爲零,那麼至少有一個過濾器在$reporteremail中找到。

3

如何將每個新字符串推送到數組的末尾而無需將該片段寫出超過50次?

試試這個:

$needles = []; 
for ($i = 0; $i < 50; $i++) { 
    $t_filter = plugin_config_get("filter$i"); 
    $needles[] = string_attribute($t_filter); 
} 

我有一個很長的字符串列表稱爲$ stringfilter1 $ stringfilter2等所有的高達$ stringfilter50

方式[...]

雖然這非常長。我在這裏把它縮短了。

我想知道是否有更乾淨,更有效的方法來做到這一點?

試試這個,它應該跟在上面的代碼塊之後。

$flag = false; 
foreach ($needles as $needle) { 
    if (stripos($reporteremail, $needle) !== false) { 
     $flag = true; 
     break; 
    } 
} 

if ($flag) { 
    runcode(); 
} 

上面的代碼的工作原理是通過$needles陣列迭代,並設置一個標誌,如果stripos不返回假。迭代完成後,它會檢查標誌是否爲真,如果是,則表示在陣列中找到了其中一根針。


編輯 或者,你可以做到這一切在一個循環,這是速度更快,效率更高。

$flag = false; 
for ($i = 0; $i < 50; $i++) { 
    $t_filter = plugin_config_get("filter$i"); 
    $needle = string_attribute($t_filter); 
    if (stripos($reporteremail, $needle) !== false) { 
     // One of the needles was found in $reporteremail. 
     runcode(); 
     break; 
    } 
}