Выбор даты из диапазона + умножение по периодам

Footniko

Новичок
Помогите сообразить.
Есть такая таблица:
tbl_periods(id, period_from, period_to, price_per_ad)
Из параметров $_GET['p_from'] и $_GET['p_to'] получаю две даты yyyy-mm-dd.

У каждого отеля есть цена, которая зависит от периода(period_from - period_to).
Мне нужно, в зависимости от выбранного пользователем периода в форме, умножать цену.
Периодов у отеля может быть много, соответственно цен тоже. Вся беда в том, что выбранный пользователем период может не совпадать с периодами отеля, В таком случае цена берется не из периода отеля а по дефолту.
 

Footniko

Новичок
Проблему уже решил. Перестроил немного структуру таблицы. Теперь она выглядит так:
tbl_periods(id, p_date, s_e_date, price_per_ad)
Где при добавлении периода, через цикл добавляются в базу даты, которые между периодом(начальной и конечной датой) и цена за каждый день. Диапазон обозначается значением из s_e_date. Если он равен 1, то это начало диапазона, если 2, то это конец. Все даты(дни) что между диапазоном обозначаются как 0 и цена у них такая же как в начальной дате и конечной.
Теперь вместо горы неработающего до конца говнокода, написан метод, который считает цену за каждый день в зависимости от диапазона, выбранного пользователем.
PHP:
	public function getPeriodFormula($p_from, $p_to, $hotelPeriods, $defaultPrice)
	{
		$per_from = (int)(CDateTimeParser::parse($p_from,'yyyy-MM-dd')/(60*60*24)); // 1
		$per_to   = (int)(CDateTimeParser::parse($p_to,'yyyy-MM-dd')/(60*60*24)); //   5
		$price = 0;
		$days = 0;
		
		while($per_from <= $per_to) {
			foreach($hotelPeriods as $h_p) {
				$period_date = (int)(CDateTimeParser::parse($h_p->p_date,'yyyy-MM-dd')/(60*60*24)); // 10
				if($per_from == $period_date) {
					$price += $h_p->price_per_ad;
					$days++;
				}	
			}
			$per_from++;
		}
		$p_from = (int)(CDateTimeParser::parse($p_from,'yyyy-MM-dd')/(60*60*24)); // 1
		$outRangePrice = (($per_to - $p_from + 1) - $days) * $defaultPrice; // 0
		$price += $outRangePrice;
		return $price;
	}
P.S. Я знаю, объясняю я не очень доступно, но если у кого то будет подобная проблема, пишите сюда...
 
Сверху