@MarkLb

Как реализовать алгоритм бонусов?

Допустим, есть система бонусов - надо добавлять к сумме определенный процент.
Например: от 1000 - 3%, от 5000 - 5%, от 10000 - 6%.

U9TkbMc.png

Как только реализовать, чтобы именно нужное число скидки выбирало?

-
Пока из идей - отсортировать сумму бонусов по возрастанию и далее:
1. Проверяем самый первый элемент. Если сумма меньше его значения бонуса - завершаем работу без бонуса.
2. Проверяем последний элемент. Если сумма больше его значения суммы бонуса - выставляем его.

3. Если сумма проходит, минимум но ниже максимума:
Проверяем каждый бонус в цикле. Когда значение суммы бонуса будет выше значения скидки - берём бонус из предыдущей итерации и возвращаем.

Если кодом:
Код

if (empty($bonuses)) {
	return null;
}

$firstBonus = $bonuses[0];
$lastBonus = $bonuses[array_keys($bonuses)[count($bonuses) - 1]];
$prevBonus = null;


if ($firstBonus > $paidSum) {
	return null;
}
if ($paidSum >= $lastBonus) {
	return $lastBonus;
}

/** @var $bonus Bonus */
foreach ($bonuses as $bonus) {
	if ($bonus->sum > $paidSum) {
		return $prevBonus ?: $bonus;
	}
	$prevBonus = $bonus;
}

return null;



Но предполагаю, что есть более тонкое решение.
  • Вопрос задан
  • 115 просмотров
Решения вопроса 1
dmitriylanets
@dmitriylanets
веб-разработчик
function calcBonus(float $sumOrd):float {
$bonusesSum = [
1000 => 0.03,
5000 => 0.05,
10000 => 0.06
];
$correct = 0;
foreach($bonusesSum as $sum => $per){
    if($sumOrd >= $sum){
        $correct =  $per;
    }
}
return $sumOrd * (1 + $correct) - $sumOrd;    
}
print_r(calcBonus(10000));
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
HunteR-VRX
@HunteR-VRX
Помешанный на развитии
Приветствую.

Самое простое в логической формулировке.
Использование конструкции условного оператора if else или switch case.

В качестве примера:

if ($summ_pay <= 1000) {
    $summ_pay = 1000 / 100 * 3
}
else if ($summ_pay >= 1000 && $summ_pay <= 5000) {
    $summ_pay = 1000 / 100 * 5
}
else if ($summ_pay >= 5000 && $summ_pay <= 6000) {
    $summ_pay = 1000 / 100 * 6
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы