Чем больше сумма заказа - тем больше скидка

  • Автор темы Автор темы Redjik
  • Дата начала Дата начала

Redjik

Джедай-мастер
Устанавливаем пороги в денежном эквиваленте, устанавливаем скидку.
При достижении суммы - пересчет.

Уже сделал такую штуку, но как то уж сильно замароченно, хочу посмотреть на нормальную реализацию.
 
Эээ, а чего тут может быть замороченного o_O

PHP:
$discounts = array(
  1000 => 5, 
  1500 => 10,
  2000 => 15,
);
function getDiscountPercent($sum, $discounts) {
  for ($discount_percent = 0, reset($discounts); current($discounts) && $sum >= key($discounts); next($discounts)) {
    $discount_percent = current($discounts);
  }
  return $discount_percent;
}
так как то наверное? или ты про что ваще?
 
PHP:
<?php
$discounts = array(
0 => 0,
10000 => 10,
25000 => 50 
);

$price = 30000;
$priceRemain = $price;
$discountTotal = 0;

foreach (array_reverse($discounts, true) as $threshold => $discount) {
   if($priceRemain >= $threshold) {
       $discountTotal += ($priceRemain - $threshold) * $discount / 100;
       $priceRemain = $threshold;
   }
}

echo $price - $discountTotal;
 
fixxxer
а, я думал он про тот случай, когда первая часть суммы идет по одной скидке, а все что выше этой части - по другой ставке
 
Хрень какая-то
PHP:
	public function getDiscountPercent(){
		$count = count($this->discounts_stops);
		$i = 0;
		$sum = $this->sumProducts();
		
		while ($count > $i){
			
			if ((int)$sum < (int)$this->discounts_stops[$i]){
				if ($i > 0){
					return $this->discounts[$i-1];
				}else{
					return 0;
				}
				
			}
				
			$i++;
		}
		return $this->discounts[$count-1];
		
	}

UPD. на кой черт я их на 2 массива разбил?
UPD2. надо срочно поспать, чтобы такие высеры не получались
 
Иван Redjik Матвеев
мде, эту задачу можно решить тремя способами (for, foreach, while) и ты выбрал наихудший %)
 
Вариантов реализации может быть три: замОроченный, нормальный и изысканный. В третьем слуаче применить гиперболическую функцию, которая так плавненько, без скачков меняет скидку.
 
y=1/x =))) упс.

Для плавного изменения скидки придумал, но,так понимаю, для порогов скидки(скачков) не подойдет.
 
Так для избавления от порогов и призвано. Кроме этого асимптоты красиво сводят скидку в 0 или в максимум.
 
Сверху