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

Redjik

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

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

fixxxer

К.О.
Партнер клуба
Эээ, а чего тут может быть замороченного :confused:

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;
}
так как то наверное? или ты про что ваще?
 

itprog

Cruftsman
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;
 

itprog

Cruftsman
fixxxer
а, я думал он про тот случай, когда первая часть суммы идет по одной скидке, а все что выше этой части - по другой ставке
 

Redjik

Джедай-мастер
Хрень какая-то
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. надо срочно поспать, чтобы такие высеры не получались
 

itprog

Cruftsman
Иван Redjik Матвеев
мде, эту задачу можно решить тремя способами (for, foreach, while) и ты выбрал наихудший %)
 

С.

Продвинутый новичок
Вариантов реализации может быть три: замОроченный, нормальный и изысканный. В третьем слуаче применить гиперболическую функцию, которая так плавненько, без скачков меняет скидку.
 

С.

Продвинутый новичок
Намек: не парабола, а гипербола
 

Redjik

Джедай-мастер
y=1/x =))) упс.

Для плавного изменения скидки придумал, но,так понимаю, для порогов скидки(скачков) не подойдет.
 

С.

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