Mam cennik pobytu w hotelu, w zależności od pory roku klient płaci różną cenę za pokój. Skrypt ma liczyć tą cenę.
Przykładowy zestaw okresów cenowych:
$term1 = mktime(0,0,0,9,4,2003);
$term11 = mktime(0,0,0,4,29,2004); // pobyt w tym okresie kosztuje powiedzmy 100 zł/dzień
//weekend 30,04,2004-2,05,2004
$term2 = mktime(0,0,0,4,30,2004);
$term22 = mktime(0,0,0,5,2,2004); // a w tym okresie np 150zł/dzień
... itd...
Nie ma problemu jeśli klient wybierze pobyt od 5.9.2003 do 10.9.2003 - wtedy za każdy dzień liczymy po 100 zł, ale jeśli zdecydyje się na okres od 27.4.2004 do 2.5.2004 to za okres do 29.4 płaci po 100 za dzień a od 29.04 po 15o zl/dzień.
Czyli musimy określić na jakie okresy cenowe przypadają wybrane przez klienta dni i po ile dni z czasu w jakim klient wybrał pobyt przypada na jaki okres cenowy
Ja rozwiązałem to w ten sposób:
function policz($p, $k, $P, $K) {
//$p - początek okresu który wybrał klient
//$k - koniec okresu który wybrał klient
//$P - początek okresu cenowego
//$K - koniec okresu cenowego
$p = (($p/60)/60)/24;
$k = (($k/60)/60)/24;
$P = (($P/60)/60)/24;
$K = (($K/60)/60)/24;
//powyżej zamieniamy date w formacie UNIX z sekund na dni które minęły od 1.1.1970r
settype($p, "int");
settype($P, "int");
settype($k, "int");
settype($K, "int");
//na wszelki wypadek zamieniamy liczbę dni na liczbę całkowitą
while ($p < $k) {
$t[] = $p;
$p++;
//rzutujemywszystkie dni z okresu jaki wybrał klient do tablicy
}
foreach ($t as $v) {
if(($v >= $P) && ($v <= $K)) {
$wspolne[] = $v;
}
}
//w pętli porównujemy daty z okresu klienta z datamu okresu cenowego, => if(($v >= $P) && ($v <= $K)),
// i jeśli jakieś się pokrywają rzyutujemy do tablicy => wspolne[] = $v;
$dc = count($wspolne);
//liczymy elementy tablicy zawierającej pokrywające się daty
return $dc;
//i mamy liczbę dni wypadających w danym okresie cenowym :))
}
Procedurę tą powtarzamy dla każdego okresu cenowego...
I gra...