Gleiche Öffnungszeiten nach Tagen zusammenfassen

Gleiche Öffnungszeiten nach Tagen zusammenfassen

am 16.09.2004 12:04:44 von itroxx

Hallo!

Ich möchte die Möglichkeit haben zu Terminen tagesweise gegebenfalls
unterschiedliche Zeiten zu speichern.

Habe mir überlegt für jeden Wochentag jeweils ein Feld in der DB zu haben
welches 1 oder 0 ist und dazu dann jeweils zwei Felder für die Zeiten

Das könnte dann zum Beispeil so aussehen:
mo = 1 mo1 = 08001200 mo2 = 14001800
di = 1 di1 = 08001200 di2 = 14001800
mi = 1 mi1 = 08001200 mi2 = 14001800
do = 1 do1 = 08001200 do2 = 14002000
fr = 1 fr1 = 08001330 fr2 = 00000000
sa = 1 sa1 = 08001200 sa2 = 00000000
so = 0 so1 = 08001300 so2 = 00000000
oder so nur zwei Abende in der Woche
mo = 0 mo1 = 00000000 mo2 = 00000000
di = 1 di1 = 18002000 di2 = 00000000
mi = 0 mi1 = 00000000 mi2 = 00000000
do = 1 do1 = 18002000 do2 = 00000000
fr = 0 fr1 = 00000000 fr2 = 00000000
sa = 0 sa1 = 00000000 sa2 = 00000000
so = 0 so1 = 00000000 so2 = 00000000

Ich überlege nun wie man diese verschieden Zeiten
am besten zusammengefasst ausgeben kann.

Mo bis Mi 08:00-12:00 und 14:00-18:00
Do 08:00-12:00 und 14:00-20:00
Fr 08:00-13:30
Sa 08:00-12:00
bzw.
Dienstag und Donnerstag 18:00 bis 20:00

Suche dazu Hinweise und Anregungen wie man das am Besten lösen könnte.
Werde jetzt mal nen bissel tüfteln und mich über jegliche Infos freuen.

Gruß Daniel

Re: Gleiche Öffnungszeiten nach Tagen zusammenfassen

am 16.09.2004 22:15:19 von Tobias Fendel

Daniel Onnen schrieb:

> Ich möchte die Möglichkeit haben zu Terminen tagesweise gegebenfalls
> unterschiedliche Zeiten zu speichern.

hallo daniel,

wenn du nicht zwingend deine struktur verwenden musst, dann würde ich
das anders angehen. bau dir einfach eine tabelle mit den feldern anfang,
ende und dann für jeden wochentag eine weitere spalte (also
mo,di,mi,do,fr,sa,so) dann speicherst du jede x-beliebige zeit und
markierst dir die tagesfelder einfach mit 1 oder 0. so auf die schnelle
denke ich, wirst du die daten besser speichern können und die
zusammenfassung kannst du dann fast direkt aus der tabelle abbilden.

hth
tobias

Re: Gleiche Öffnungszeitennach Tagen zusammenfassen

am 17.09.2004 00:11:05 von christoph.paeper

Daniel Onnen :
>
> Ich möchte die Möglichkeit haben zu Terminen tagesweise gegebenfalls
> unterschiedliche Zeiten zu speichern.
> Habe mir überlegt für jeden Wochentag jeweils ein Feld in der DB zu haben
> welches 1 oder 0 ist und dazu dann jeweils zwei Felder für die Zeiten

Ich würde den Tag je nach Bedarf in ein Stunden-, Halbstunden- oder
Viertelstundenraster einteilen (evtl. nur von frühester Öffnungs- bis
spätester Schließungszeit) und das dann als Bitmuster speichern, z.B.:

// Halbstundenraster, [08, 20) Uhr -> 12·2
$offset = "0800";
$open = array_map("bindec", array(
"Mo"=>"111111110000111111110000", // Montag
"Di"=>"111111110000111111110000", // Dienstag
"Mi"=>"111111110000111111110000", // Mittwoch
"Do"=>"111111110000111111111111", // Donnerstag
"Fr"=>"111111111110000000000000", // Freitag
"Sa"=>"111111110000000000000000", // Sonnabend
"So"=>"111111111100000000000000") // Sonntag
);

> Ich überlege nun wie man diese verschieden Zeiten
> am besten zusammengefasst ausgeben kann.

Das kommt darauf an. Im Zweifelsfall eine Zeile für jeden Wochentag, bei
Mittagspause auch in Vormittag/Nachmittag eingeteilt.

Montag 08:00 - 12:00 14:00 - 18:00
Dienstag 08:00 - 12:00 14:00 - 18:00
Mittwoch 08:00 - 12:00 14:00 - 18:00
Donnerstag 08:00 - 12:00 14:00 - 20:00
Freitag 08:00 - 13:30 -
Samstag 08:00 - 12:00 -
Sonntag 08:00 - 13:00 -

(Gegebenenfalls Sonnabend statt Samstag.)

> Mo bis Mi 08:00-12:00 und 14:00-18:00
> Do 08:00-12:00 und 14:00-20:00
> Fr 08:00-13:30
> Sa 08:00-12:00

tägl. 8-12 (Fr 13.30, So 13) Uhr und
Mo-Do 14-18 (Do 20) Uhr.

oder ...

Mo-Mi 14-18 Uhr, Do 14-20 Uhr.

sind schön kurz und m.M.n. halbwegs schnell verständlich, obwohl diese
Öffnungszeiten eigentlich viel zu kompliziert sind. In einen generellen
Algorithmus bzw. PHP-Code möchte ich sowas aber nicht fassen müssen, aus
den Bitmasken oder auch deiner Datenstruktur ließe sich aber recht leicht
eine Tabelle erstellen (HTML, Text, ...), die sich zumindest optisch gut
erfassen lässt.

Mo XXXXXXXX XXXXXXXX
Di XXXXXXXX XXXXXXXX
Mi XXXXXXXX XXXXXXXX
Do XXXXXXXX XXXXXXXXXXXX
Fr XXXXXXXXXXX
Sa XXXXXXXX
So XXXXXXXXXX

Der PHP-Bezug in deiner Frage (und meiner Antwort) ist mir ein wenig
entgangen.

--
»Space may be the final frontier,
but it's made in a Hollywood basement.« Red Hot Chili Peppers - Californication

Re: Gleiche Öffnungszeiten nach Tagen zusammenfassen

am 22.09.2004 03:30:01 von Simon Stienen

Jetzt mal ganz vom Problem abgesehen, schiesst du dir mit dem Code selbst
in den Fuss unt knallst dir Fehler rein, die nur extrem schwer zu finden
sind...

Daniel Onnen > wrote:
> Das könnte dann zum Beispeil so aussehen:
> mo = 1 mo1 = 08001200 mo2 = 14001800
Schon da hättest du einen Parse Error.

Viel Spass beim suchen:
$mo = 08001200; // Parse Error
?>

-----ROT13 BLOCK BEGIN-----
Qrvar Mnuy jveq -qn fvr zvg rvare Ahyy ortvaag- nyf Bxgnymnuy nhstrsnffg.
Aha tvog rf nore yrvqre xrvar npug bqre arha nyf Mvssre va rvare
Bxgnymnuy... Qre Cnefre orfpujreg fvpu haq jvesg qve rzcbregr
Sruyrezryqhatra na qra Xbcs :)
------ROT13 BLOCK END------


ZUM Problem:
Schreib doch für jeden Wochentag die formatierte Öffnungszeit
(selbstverständlich ohne die Wochentage) in ein Array:
$zeiten1 = array (
0 => '14:00 bis 18:00',
1 => '08:00 bis 15:00 und 18:00 bis 21:00',
2 => ...,
...
);

Jetzt drehst du den Spieß um:
$zeiten2 = array();
for ($i=0; $i<7; $i++)
if (isset($zeiten2[$zeiten1[$i]]))
$zeiten2[$zeiten1[$i]] .= '+'.$i;
else
$zeiten2[$zeiten1[$i]] = $i;

Nun hast du jeweils den Öffnungszeiten einen String zugeordnet, z.B.:
'0+3+6', '1+4+5' und '2'
Jetzt wird eine Funktion gebraucht, die die beieinanderliegenden Tage
zusammenfasst... mal ins Unreine geschrieben:
function compact_days($str) {
for ($i=0; $i<6; $i++)
$str = str_replace($i.'+'.($i+1), $i.'-'.($i+1), $str);

// falls montag und sonntag enthalten sind
if ($str[0]=='0' && $str[strlen($str)-1]=='6' &&
// und zusätzlich dienstag oder samstag
($str[0]=='-' || $str[strlen($str)-2]=='-') &&
// und sie nicht ohnehin schon in einer gruppe sind
// (= konstante öffnungszeiten die gesamte woche)
strpos($str, '+'))
// ziehe die gruppe mit dem sonntag nach vorne
$str = substr($str, ($pos=strrpos($str,'+'))+1)
. '-' . substr($str, 0, $pos);

// zusammenfassen von a-b-c-d zu a-d
$i=1; while(($i+=2) while ($str[$i-2]=='-' && $str[$i]=='-')
$str = substr($str, 0, $i-2) . substr($str, $i);
// Diese Schleife in verstehbarer Langform nochmal unten ;) [1]

// aus 1-2 2-3 3-4 .... wieder 1+2 2+3 .... machen
// ("und" statt "bis" bei ketten der länge 2)
for ($i=0; $i<6; $i++)
$str = str_replace($i.'-'.($i+1), $i.'+'.($i+1), $str);

return $str; // ich hoffe ich habe nichts vergessen...
}

Die Kette gibt jetzt die Liste der Wochentage an.
"Montags bis Donnerstags und Samstags" ist jetzt z.B. "1-4+6"
Als nächstes muss umformatiert werden:
function format_daylist($list) {
// Letztes "+" als "und", die anderen als Aufzählung mit Kommata
// Die "-" ersetzen durch "bis"
// Die Ziffern durch die entsprechenden Wochentagsnamen ersetzen.
if ($pos=strrpos($str,'+')) $str[$pos]='*';
return strtr($str, array(
'0' => 'Montag',
'1' => 'Dienstag',
'2' => 'Mittwoch',
'3' => 'Donnerstag',
'4' => 'Freitag',
'5' => 'Samstag',
'6' => 'Sonntag',
'-' => ' bis ',
'+' => ', ',
'*' => ' und '
));
}

Das sollte das schwierigste gewesen sein, der Rest müsste sich aufs
Zusammenbauen beschränken.

Der Code ist nach dem VHIDT-System geschrieben und somit ungetestet.

[1] Die "Einkürzschleife" in Langform:
-----BEGIN CODE BLOCK-----
$i=3; while($i if ($str[$i-2]=='-' && $str[$i]=='-')
// zusammenfassen
$str = substr($str, 0, $i-2) . substr($str, $i);
else
// nächste Stelle prüfen
$i += 2;
// Abbruchbedingung unschön (wegen des Funktionsaufrufs).
// Da die Strings jedoch nur sehr kurz sind ist das m.E.
// auf diese Weise praktischer als in einer zweiten Variable
// über die Länge Buch zu führen.
------END CODE BLOCK------

--
Simon Stienen
»What you do in this world is a matter of no consequence,
The question is, what can you make people believe that you have done.«
-- Sherlock Holmes in "A Study in Scarlet" by Sir Arthur Conan Doyle