[PHP] Efficiënt perioden calculeren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste mensen hallo! Hier komt een complex verhaal. Alle oplossingen en reacties zijn van harte welkom, ik vraag je echter wel om ALLES dat hieronder staat eerst even door te lezen voordat je een reactie geeft. Thanx a lot!

Ik ben dus bezig met het maken van een agenda systeem voor een verhuurbedrijf van groepsaccommodaties. Zoals je zult begrijpen wordt hier vaak gewerkt met standaard perioden zoals de midweek (ma t/m vr), weekend (vr t/m ma) en de hele week (ma t/m ma of vr t/m vr).

Ik ga jullie nu even 3 maanden voorleggen (mei, juni en juli) en daarvan neem ik de middelste (juni) als voorbeeld om mijn probleem uit te leggen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
--------------------------
#        Mei 2003        #
--------------------------
Zo  Ma  Di  Wo  Do  Vr  Za  
            1   2   3  
4   5   6   7   8   9   10  
11  12  13  14  15  16  17  
18  19  20  21  22  23  24  
25  26  27  28  29  30  31  
--------------------------


--------------------------
#       Juni 2003        #
--------------------------
Zo  Ma  Di  Wo  Do  Vr  Za  
1   2   3   4   5   6   7  
8   9   10  11  12  13  14  
15  16  17  18  19  20  21  
22  23  24  25  26  27  28  
29  30                 
--------------------------


--------------------------
#       Juli 2003        #
--------------------------
Zo  Ma  Di  Wo  Do  Vr  Za  
        1   2   3   4   5  
6   7   8   9   10  11  12  
13  14  15  16  17  18  19  
20  21  22  23  24  25  26  
27  28  29  30  31        
--------------------------
Deze agenda wordt datum voor datum automatisch gegenereerd in mijn php-script. D.m.v. de functie IsRes() kan ik nagaan of een bepaalde datum wel of niet gereserveerd is. Als ik 1 terugkrijg is de datum reeds gereserveerd, bij 0 is de datum nog vrij.

Omdat er standaard perioden (midweek, weekend en week) berekend kunnen worden zou ik in bovenstaand geval (voor het gemak er even vanuit gaande dat alle data nog vrij is) het volgende lijstje willen genereren:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
midweek: ma 02 juni t/m vr 06 juni
midweek: ma 09 juni t/m vr 13 juni
midweek: ma 16 juni t/m vr 20 juni
midweek: ma 23 juni t/m vr 27 juni
midweek: ma 30 juni t/m vr 04 juli
weekend: vr 30 mei  t/m ma 02 juni
weekend: vr 06 juni t/m ma 09 juni
weekend: vr 11 juni t/m ma 14 juni
weekend: vr 18 juni t/m ma 21 juni
weekend: vr 25 juni t/m ma 28 juni
week   : ma 02 juni t/m ma 09 juni
week   : vr 06 juni t/m vr 13 juni
week   : ma 09 juni t/m ma 16 juni
week   : vr 13 juni t/m vr 20 juni
week   : ma 16 juni t/m ma 23 juni
week   : vr 20 juni t/m vr 27 juni
week   : ma 23 juni t/m ma 30 juni
week   : vr 27 juni t/m vr 04 juli
Indien dan bijvoorbeeld de data 6 juni, 7 juni, 8 juni en 9 juni bezet blijken te zijn moeten de volgende perioden niet meer getoond worden, omdat deze de bezette data overlappen:
code:
1
2
3
weekend: vr 06 juni t/m ma 09 juni
week   : ma 02 juni t/m ma 09 juni
week   : vr 06 juni t/m vr 13 juni
Nou is mijn vraag hoe ik dit zo efficiënt mogelijk voor elkaar kan krijgen. Kijk, met een lap code van 5 beeldschermen vol kan ik dit wel voor elkaar krijgen, maar ik heb het gevoel dat dat veel efficiënter kan. Mijn gedachte zou zijn om per data alle mogelijkheden te berekenen! Maar dat komt er op neer dat je sommige data wel 30 keer controleert of deze wel of niet bezet is.

Ik hoop dus dat een van jullie voldoende intelligentie heeft om zich in deze situatie in te kunnen leven en in staat is om mij hierbij te helpen. Ik ben uiteraard graag bereid nader toe te lichten indien je vragen hebt.

Acties:
  • 0 Henk 'm!

Verwijderd

Even snel nagedacht: (correct me if i'm wrong :))

Werken met UNIX timestamps. Een bepaalde periode heeft een bepaalde begin timestamp en een bepaalde eind timestamp. Je kunt nu dus aan de hand van de reserveringen controleren of er een reservering in een bepaalde periode valt.
(ik gebruik even hypothetische timestamps)

6 juni, 7 juni, 8 juni en 9 juni blijken bezet te zijn (timestamps 6, 7, 8, 9)
code:
1
2
3
weekend: vr 06 juni t/m ma 09 juni       (zeg timestamp 6-9)
week   : ma 02 juni t/m ma 09 juni       (zeg timestamp 2-9)
week   : vr 06 juni t/m vr 13 juni       (zeg timestamp 6-13)

je kunt dus met 1 regel code checken of de periode weergegeven kan worden.

(het is iets ingewikkelder omdat je een reservering begin timestamp hebt en eind timestamp. je vergelijkt dus periodes... maar er moet een uitdaging blijven, nietwaar? ;) )
even snel uitgelegd...

[ Voor 30% gewijzigd door Verwijderd op 14-05-2003 14:30 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Hoe reserveer jij? Sla je dat per dag op, of per periode?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op 14 mei 2003 @ 14:28:
Hoe reserveer jij? Sla je dat per dag op, of per periode?
per dag...

het kan namelijk wel eens voorkomen dat iemand alleen de maandag en dinsdag reserveert en vervolgens de wo, do en vr open laat. dit is een probleem dat ik zelf wel op kan lossen, maar daarvoor heb ik dus wel datums PER STUK nodig...

had je liever iets anders gehad? waarom dan?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik begrijp jammer genoeg niet helemaal wat je bedoeld. Als ik je goed begrijp run ik dan ongeveer 30 mysql querys, maar dat lijkt me niet helemaal de bedoeling ivm de parsetime...

Ik heb alle data in een aparte tabel staan als volgt:
code:
1
2
3
4
5
6
7
TABLE DATES:
accom_id  date
1         2003-05-14
1         2003-05-15
1         2003-05-16
1         2003-05-17
1         2003-05-18
De accom_id is het ID van een bepaalde accommodatie. De datum is in mysql ook daadwerkelijk van het type "date".

Ik geloof wel dat je begrijpt wat ik bedoel, ik echter nog niet wat jij bedoeld... We moeten er dus wel uit kunnen komen denk ik ;) :) :D

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

misschien een stukje redundantie inbouwen in de vorm van een beschikbaarheids-table op accomodatie-niveau met alle datums waar al voor gereserveerd is.
Hierdoor hoef je dan niet meer alle losse reserveringen af, maar kan je gelijk alle niet-beschikbare dagen 'over' je kalender heenleggen zodat je eenvoudig en snel kan bepalen welke perioden de accomodatie wel beschikbaar is.

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Ik kan niet jouw hele probleem uitwerken... hier een korte omschrijving

Je voert een query uit zodat je dat tabelletje met gereserveerde data in een array hebt
De data converteer je naar UNIX timestamp (dit kun je eventueel per accomodatie doen, dan krijg je idd meerdere query's)
Je laat de periodes zien, en kan controleren of een datum in een bepaalde periode bezet is dmv de unix timestamps:

begindatum periode als timestamp
einddatum periode als timestamp
array met gereserveerde timestamps

als er dus een item uit de array met gereserveerde timestamps tussen de begindatum periode en de einddatum periode valt hoef je de periode niet weer te geven.

Acties:
  • 0 Henk 'm!

Verwijderd

crisp schreef op 14 May 2003 @ 14:49:
misschien een stukje redundantie inbouwen in de vorm van een beschikbaarheids-table op accomodatie-niveau met alle datums waar al voor gereserveerd is.
Dat heeft ie toch?
code:
1
2
3
4
5
6
7
TABLE DATES:
accom_id  date
1         2003-05-14
1         2003-05-15
1         2003-05-16
1         2003-05-17
1         2003-05-18

[ Voor 26% gewijzigd door Verwijderd op 14-05-2003 14:55 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nou begrijp ik waarom ik je niet snap. Mijn probleem is namelijk niet hoe ik die inmiddels bezette periode niet moet weergeven, maar juist hoe ik dat eerste lijstje met mogelijke perioden samen kan stellen. Tenminste, hoe ik die zo efficiënt mogelijk kan samenstellen...

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op 14 mei 2003 @ 14:54:
[...]

Dat heeft ie toch?

[...]
wat ik daaruit begreep is dat daar gewoon per accomodatie alleen maar alle data in vermeld staat, dus ongeacht of er gereserveerd is voor die datum of niet.

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

crisp schreef op 14 mei 2003 @ 14:58:
[...]
wat ik daaruit begreep is dat daar gewoon per accomodatie alleen maar alle data in vermeld staat, dus ongeacht of er gereserveerd is voor die datum of niet.
zou ook nog kunnen ja :>

edit:

[quote]
Deze agenda wordt datum voor datum automatisch gegenereerd in mijn php-script.
[/quote]
of toch niet?

[ Voor 21% gewijzigd door Verwijderd op 14-05-2003 15:01 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
crisp schreef op 14 May 2003 @ 14:58:
[...]

wat ik daaruit begreep is dat daar gewoon per accomodatie alleen maar alle data in vermeld staat, dus ongeacht of er gereserveerd is voor die datum of niet.
ik zou wel gek zijn om 365 dagen per jaar in een tabel te gaan gooien... dit kan automatisch wel... wat je met de functies mktime() en date() in php allemaal wel niet kunt :P

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 14 May 2003 @ 15:01:
[...]
ik zou wel gek zijn om 365 dagen per jaar in een tabel te gaan gooien... dit kan automatisch wel... wat je met de functies mktime() en date() in php allemaal wel niet kunt :P
_/-\o_ :*)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
[...]

Nou begrijp ik waarom ik je niet snap. Mijn probleem is namelijk niet hoe ik die inmiddels bezette periode niet moet weergeven, maar juist hoe ik dat eerste lijstje met mogelijke perioden samen kan stellen.

[ Voor 13% gewijzigd door Verwijderd op 14-05-2003 15:04 ]

Pagina: 1