2016-05-18 24 views
2

所以我有這樣的代碼......(對不起)多重如果冷凝 - PHP

(我需要在我的問題更多「細節」的代碼是這麼長) 基本上它需要用戶擁抱計數,每隔一段時間給他們一個新的報價作爲獎勵,但時間間隔不規則。

if ($hugs > 0) { 
    $quote = $quotes[0]; 
} 
if ($hugs > 5) { 
    $quote = $quotes[1]; 
} 
if ($hugs > 10) { 
    $quote = $quotes[2]; 
} 
if ($hugs > 20) { 
    $quote = $quotes[3]; 
} 
if ($hugs > 50) { 
    $quote = $quotes[4]; 
} 
if ($hugs > 100) { 
    $quote = $quotes[5]; 
} 
if ($hugs > 150) { 
    $quote = $quotes[6]; 
} 
if ($hugs > 200) { 
    $quote = $quotes[7]; 
} 
if ($hugs > 250) { 
    $quote = $quotes[8]; 
} 
if ($hugs > 500) { 
    $quote = $quotes[9]; 
} 
if ($hugs > 750) { 
    $quote = $quotes[10]; 
} 
if ($hugs > 1000) { 
    $quote = $quotes[11]; 
} 
if ($hugs > 1500) { 
    $quote = $quotes[12]; 
} 

由於擁抱計數之間的間隔是不規則的,有沒有辦法壓縮這種情況呢?

TIA。

+5

就我個人而言,我會去switch語句和案例。只需將if的順序從高到低顛倒即可。 –

回答

3

你當然可以凝結它!一種方法是構建一個關聯數組(鍵值對),如下例所示。

/** 
* Returns a quote based on the number of hugs 
* 
* @param int $hugs 
* @param array $quotes 
* 
* @return string|null 
*/ 
function getQuoteFromHugs($hugs, $quotes) { 
    $hugs_quotes = array(
     1500 => $quotes[12], 
     1000 => $quotes[11], 
     750 => $quotes[10], 
     500 => $quotes[9], 
     250 => $quotes[8], 
     200 => $quotes[7], 
     150 => $quotes[6], 
     100 => $quotes[5], 
     50 => $quotes[4], 
     20 => $quotes[3], 
     10 => $quotes[2], 
     5 => $quotes[1], 
     0 => $quotes[0], 
    ); 

    foreach($hugs_quotes as $hug_minimum => $quote) { 
     if($hugs > $hug_minimum) { 
      return $quote; 
     } 
    } 
    return null; 
} 

// Usage 
$quote = getQuoteFromHugs($hugs, $quotes); 

這會遍歷每個鍵值對的順序,看看您的$ hugs參數是否大於該鍵。如果是這樣,它將返回與該鍵關聯的值。

+0

編輯時將$引號作爲變量包含在函數調用中。 出色地工作,謝謝! –

+0

我之所以沒這麼做是因爲我擔心它可能不會按照我們想要的順序迭代。 – Fabricator

1

這裏的組織它的方式:

function getQuote($hugs) { 
    $hugQuotes = array(
     array(1500, $quotes[12]), 
     array(1000, $quotes[11]), 
     ... 
    ); 

    foreach($hugQuotes as $v) { 
     $c = $v[0]; 
     $quote = $v[1]; 
     if ($hugs > $c) return $quote; 
    } 

    return $quote; 
} 
+2

小心;你的hugQuotes數組不是聯想的,所以你不會得到你期望的結果! –

+0

@ChrisForrence,哎呀。感謝您指出這一點 – Fabricator

2

什麼是這樣的:

$steps = array(0, 5, 10, 20, 50, 100, 150, 200, 250, 500, 750, 1000, 1500); 
foreach ($steps as $index => $step) { 
    if ($hugs > $step) { 
     $quote = $quotes[$index]; 
    } 
} 

它使用$steps數組的索引$quotes陣列下一步的映射。

+0

如果你交換你的比較,你可以在那裏添加一個'break',並使它更有效一點點 – andrewsi

+1

你是否認爲'foreach($ steps as ...)'? – user5329483

+0

哈哈是的,請編輯。我在打電話。 –