2016-05-18 3 views
2

Так что я этот код ... (я извиняюсь)Multiple Если Конденсация - 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

Лично я бы пошел с заявлением о переключении и случаями. Просто измените порядок 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); 

Это перебирает ключ-значение спаривания в порядке и видит, если ваш параметр $ объятий больше, чем ключ. Если это так, он возвращает значение, связанное с этим ключом.

+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, oops. спасибо, что указали, что вне – 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

Ха-ха да, пожалуйста, отредактируйте. Я на своем телефоне. –

Смежные вопросы