#2: Re: Gleiche Öffnungszeiten nach Tagen zusammenfassen
Posted on 2004-09-16 22:15:19 by 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
Report this message |
#3: Re: Gleiche Öffnungszeitennach Tagen zusammenfassen
Posted on 2004-09-17 00:11:05 by christoph.paeper
Daniel Onnen <itroxx@gmx.de>:
>
> 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
Report this message |
#4: Re: Gleiche Öffnungszeiten nach Tagen zusammenfassen
Posted on 2004-09-22 03:30:01 by 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 <Daniel Onnen <itroxx@gmx.de>> 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:
<?php
$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)<strlen($str))
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<strlen($str))
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 <http://dangerouscat.net> <http://slashlife.de>
»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
Report this message |