KW als Spalte einfügen
bearbeitet von Rolf BHallo Bernd,
wie Du dieses Problem löst, zeige ich Dir jetzt, weil es als Programmierlektion wichtig ist - **aber das kannst Du für deinen Kalender nicht verwenden!** Reginas Tipp hat einen unangenehmen Fehler (wenn sonst nichts im Beitrag stände, müsste ich dafür das [-] klicken). Erklärung folgt.
Du solltest das Erhöhen der Wochennummer und das Erstellen der Nummernspalte nicht trennen. Der Effekt ist bei Dir, dass beim ersten Wochenwechsel noch kein Inkrement stattgefunden hat. Entferne das $weekNumber++ vom Anfang der Schleife und setze es an dieser Stelle ein, ohne Bedingung (weil Du ja hier schon weißt dass ein Wochenwechsel vorliegt):
~~~php
// Neue Woche
$week = '';
$week .= '<td>'. $weekNumber .'</td>';
~~~
Und bei der Gelegenheit kannst Du auch das Leeren von $week und das Anhängen des ersten Inhaltes zu einem Befehl verbinden. Der Code müsste nach der Verschiebung so aussehen:
~~~php
// Neue Woche
$weekNumber++;
$week = '<td>'. $weekNumber .'</td>';
~~~
Das könnte man noch verkürzen (in bester C-Tradition: Einzeilige Programme beliebiger Komplexität), indem man den ++ Operator als Präfix einsetzt ($a++ und ++$a inkrementieren beide $a, aber $a++ liefert den alten und ++$a den neuen Wert von $a):
~~~php
// Neue Woche
$week = '<td>'. (++$weekNumber) .'</td>';
~~~
Die Klammer ist formal nicht nötig, die habe ich als Lesehilfe gesetzt.
#Warum Du das nicht verwenden kannst
2017 und 2016 hättest Du im Januar Probleme, weil da der 01.01. zur KW des vorigen Jahres gehört. Deine Wochen wären also von 52-56 oder von 53-57 gelaufen.
Dieses Jahr hättest Du im Dezember Probleme, weil Du den 31.12. in die KW 53 setzen würdest. Er liegt aber in KW 01-2019.
Am einfachsten ist es wohl, die KW pro Schleifendurchlauf neu von PHP bestimmen zu lassen. Und wenn Deine Programmstruktur in etwa der logischen Struktur der Ausgabe entspricht, tust Du Dich in einigem leichter! Als Leser tut man sich leichter, wenn Kommentare da sind die besagen, was da inhaltlich passiert. Ich habe mal ein paar eingefügt. Plus ein paar Kommentare mit technischen Hinweisen für Dich, die eine von dir bisher vorher nicht verwendete PHP Funktion erläutern.
~~~php
// Erzeugt ein Array mit den Elementen des Tagesdatums
$today = getDate();
// Bestimme Wochentag des letzten Tages im vorigen Monat. 0=So, 1=Mo, ... 6=Sa
$wDay = date('w', mktime(0,0,0,$today['mon'],0,$today['year']));
// $curDay ist der aktuell aufbereitete Kalendertag. Beginnt der Monat nicht mit
// dem Montag, wird $curDay soweit rückgerechnet dass es einem Montag entspricht. Der vorher ermittelte $wDay-Wert passt dafür prima.
$curDay = 1 - $wDay;
// Tage im laufenden Monan. In $today[0] steht der Unix-Timestamp
$day_count = date('t', $today[0]);
// Helper für die Date-Links
$ym = strftime("%Y-%m-", $today[0]);
while ($curDay <= $day_count) {
// mktime-Eigenschaft: Es rechnet Werte um, die außerhalb der erlaubten Bereich liegen.
// Der -4.09.2018 entspricht dem 27.08.
// $curDay wird so verwaltet, dass es zu diesem Zeitpunkt immer auf einem Montag steht.
$week = "<td>"
. date("W", mktime(0,0,0,$today['mon'],$curDay,$today['year']))
. "</td>";
// Eine Wochenzeile, bestehend aus 7 Tagen, produzieren
for ($d=0; $d<7; $d++) {
if ($curDay < 1 || $curDay > $day_count) {
// außerhalb des Monatszeitfensters. Man könnte hier auch eine ausgegraute Tagesnummer
// hinschreiben :)
$week .= "<td></td>";
}
else {
$curDayFmt = sprintf("%02d",$curDay);
$week .= "<td><div><a href='day.php?date=$ym$curDayFmt'>$curDay</a></div></td>";
}
$curDay++;
}
$weeks[] = "<tr>" . $week . "</tr>";
$curDay++;
}
~~~
Der Code ist grob in [PHP Sandbox](http://sandbox.onlinephpfunctions.com/) getestet - aber keine Garantie für Korrektheit :). Er dürfte aber einige der bisherigen Probleme nicht mehr haben.
_Rolf_
--
sumpsi - posui - clusi
KW als Spalte einfügen
bearbeitet von Rolf BHallo Bernd,
wie Du dieses Problem löst, zeige ich Dir jetzt, weil es als Programmierlektion wichtig ist - **aber das kannst Du für deinen Kalender nicht verwenden!** Reginas Tipp hat einen unangenehmen Fehler (wenn sonst nichts im Beitrag stände, müsste ich dafür das [-] klicken). Erklärung folgt.
Du solltest das Erhöhen der Wochennummer und das Erstellen der Nummernspalte nicht trennen. Der Effekt ist bei Dir, dass beim ersten Wochenwechsel noch kein Inkrement stattgefunden hat. Entferne das $weekNumber++ vom Anfang der Schleife und setze es an dieser Stelle ein, ohne Bedingung (weil Du ja hier schon weißt dass ein Wochenwechsel vorliegt):
~~~php
// Neue Woche
$week = '';
$week .= '<td>'. $weekNumber .'</td>';
~~~
Und bei der Gelegenheit kannst Du auch das Leeren von $week und das Anhängen des ersten Inhaltes zu einem Befehl verbinden. Der Code müsste nach der Verschiebung so aussehen:
~~~php
// Neue Woche
$weekNumber++;
$week = '<td>'. $weekNumber .'</td>';
~~~
Das könnte man noch verkürzen (in bester C-Tradition: Einzeilige Programme beliebiger Komplexität), indem man den ++ Operator als Präfix einsetzt ($a++ und ++$a inkrementieren beide $a, aber $a++ liefert den alten und ++$a den neuen Wert von $a):
~~~php
// Neue Woche
$week = '<td>'. (++$weekNumber) .'</td>';
~~~
Die Klammer ist formal nicht nötig, die habe ich als Lesehilfe gesetzt.
#Warum Du das nicht verwenden kannst
2017 und 2016 hättest Du im Januar Probleme, weil da der 01.01. zur KW des vorigen Jahres gehört. Deine Wochen wären also von 52-56 oder von 53-57 gelaufen.
Dieses Jahr hättest Du im Dezember Probleme, weil Du den 31.12. in die KW 53 setzen würdest. Er liegt aber in KW 01-2019.
Am einfachsten ist es wohl, die KW pro Schleifendurchlauf neu von PHP bestimmen zu lassen. Und wenn Deine Programmstruktur in etwa der logischen Struktur der Ausgabe entspricht, tust Du Dich in einigem leichter! Als Leser tut man sich leichter, wenn Kommentare da sind die besagen, was da inhaltlich passiert. Ich habe mal ein paar eingefügt. Plus ein paar Kommentare mit technischen Hinweisen für Dich, die eine von dir bisher vorher nicht verwendete PHP Funktion erläutern.
~~~php
// Erzeugt ein Array mit den Elementen des Tagesdatums
$today = getDate();
// Bestimme Wochentag des letzten Tages im vorigen Monat. 0=So, 1=Mo, ... 6=Sa
$wDay = date('w', mktime(0,0,0,$today['mon'],0,$today['year']));
// $curDay ist der aktuell aufbereitete Kalendertag. Beginnt der Monat nicht mit
// dem Montag, wird $curDay soweit rückgerechnet dass es einem Montag entspricht. Der vorher ermittelte $wDay-Wert passt dafür prima.
$curDay = 1 - $wDay;
// Tage im laufenden Monan. In $today[0] steht der Unix-Timestamp
$day_count = date('t', $today[0]);
// Helper für die Date-Links
$ym = strftime("%Y-%m-", $today[0]);
while ($curDay <= $day_count) {
// mktime-Eigenschaft: Es rechnet Werte um, die außerhalb der erlaubten Bereich liegen.
// Der -4.09.2018 entspricht dem 27.08.
// $curDay wird so verwaltet, dass es zu diesem Zeitpunkt immer auf einem Montag steht.
$week = "<td>"
. date("W", mktime(0,0,0,$today['mon'],$curDay,$today['year']))
. "</td>";
// Eine Wochenzeile, bestehend aus 7 Tagen, produzieren
for ($d=0; $d<7; $d++) {
if ($curDay < 1 || $curDay > $day_count) {
// außerhalb des Monatszeitfensters. Man könnte hier auch eine ausgegraute Tagesnumer
// hinschreibem :)
$week .= "<td></td>";
}
else {
$curDayFmt = sprintf("%02d",$curDay);
$week .= "<td><div><a href='day.php?date=$ym$curDayFmt'>$curDay</a></div></td>";
}
$curDay++;
}
$weeks[] = "<tr>" . $week . "</tr>";
$curDay++;
}
~~~
Der Code ist grob in [PHP Sandbox](http://sandbox.onlinephpfunctions.com/) getestet - aber keine Garantie für Korrektheit :). Er dürfte aber einige der bisherigen Probleme nicht mehr haben.
_Rolf_
--
sumpsi - posui - clusi
KW als Spalte einfügen
bearbeitet von Rolf BHallo Bernd,
wie Du dieses Problem löst, zeige ich Dir jetzt, weil es als Programmierlektion wichtig ist - **aber das kannst Du für deinen Kalender nicht verwenden!** Reginas Tipp hat einen unangenehmen Fehler (wenn sonst nichts im Beitrag stände, müsste ich dafür das [-] klicken). Erklärung folgt.
Du solltest das Erhöhen der Wochennummer und das Erstellen der Nummernspalte nicht trennen. Der Effekt ist bei Dir, dass beim ersten Wochenwechsel noch kein Inkrement stattgefunden hat. Entferne das $weekNumber++ vom Anfang der Schleife und setze es an dieser Stelle ein, ohne Bedingung (weil Du ja hier schon weißt dass ein Wochenwechsel vorliegt):
~~~php
// Neue Woche
$week = '';
$week .= '<td>'. $weekNumber .'</td>';
~~~
Und bei der Gelegenheit kannst Du auch das Leeren von $week und das Anhängen des ersten Inhaltes zu einem Befehl verbinden. Der Code müsste nach der Verschiebung so aussehen:
~~~php
// Neue Woche
$weekNumber++;
$week = '<td>'. $weekNumber .'</td>';
~~~
Das könnte man noch verkürzen (in bester C-Tradition: Einzeilige Programme beliebiger Komplexität), indem man den ++ Operator als Präfix einsetzt ($a++ und ++$a inkrementieren beide $a, aber $a++ liefert den alten und ++$a den neuen Wert von $a):
~~~php
// Neue Woche
$week = '<td>'. (++$weekNumber) .'</td>';
~~~
Die Klammer ist formal nicht nötig, die habe ich als Lesehilfe gesetzt.
#Warum Du das nicht verwenden kannst
2017 und 2016 hättest Du im Januar Probleme, weil da der 01.01. zur KW des vorigen Jahres gehört. Deine Wochen wären also von 52-56 oder von 53-57 gelaufen.
Dieses Jahr hättest Du im Dezember Probleme, weil Du den 31.12. in die KW 53 setzen würdest. Er liegt aber in KW 01-2019.
Am einfachsten ist es wohl, die KW pro Schleifendurchlauf neu von PHP bestimmen zu lassen. Und wenn Deine Programmstruktur in etwa der logischen Struktur der Ausgabe entspricht, tust Du Dich in einigem leichter! Als Leser tut man sich leichter, wenn Kommentare da sind die besagen, was da inhaltlich passiert. Ich habe mal ein paar eingefügt. Plus ein paar Kommentare mit technischen Hinweisen für Dich, die eine von dir bisher vorher nicht verwendete PHP Funktion erläutern.
~~~php
// Erzeugt ein Array mit den Elementen des Tagesdatums
$today = getDate();
// Bestimme Wochentag des letzten Tages im vorigen Monat. 0=So, 1=Mo, ... 6=Sa
$wDay = date('w', mktime(0,0,0,$today['mon'],0,$today['year']));
// $curDay ist der aktuell aufbereitete Kalendertag. Beginnt der Monat nicht mit
// dem Montag, wird $curDay soweit rückgerechnet dass es einem Montag entspricht. Der vorher ermittelte $wDay-Wert passt dafür prima.
$curDay = 1 - $wDay;
// Tage im laufenden Monan. In $today[0] steht der Unix-Timestamp
$day_count = date('t', $today[0]);
// Helper für die Date-Links
$ym = strftime("%Y-%m-", $today[0]);
while ($curDay <= $day_count) {
// mktime-Eigenschaft: Es rechnet Werte um, die außerhalb der erlaubten Bereich liegen.
// Der -4.09.2018 entspricht dem 27.08.
// $curDay wird so verwaltet, dass es zu diesem Zeitpunkt immer auf einem Montag steht.
$week = "<td>"
. date("W", mktime(0,0,0,$today['mon'],$curDay,$today['year']))
. "</td>";
// $d ist einfach nur ein Zähler für 7 Tage.
for ($d=0; $d<7; $d++) {
if ($curDay < 1 || $curDay > $day_count) { // außerhalb des Monatszeitfensters
$week .= "<td></td>";
}
else {
$curDayFmt = sprintf("%02d",$curDay);
$week .= "<td><div><a href='day.php?date=$ym$curDayFmt'>$curDay</a></div></td>";
}
$curDay++;
}
$weeks[] = "<tr>" . $week . "</tr>";
$curDay++;
}
~~~
Der Code ist grob in [PHP Sandbox](http://sandbox.onlinephpfunctions.com/) getestet - aber keine Garantie für Korrektheit :). Er dürfte aber einige der bisherigen Probleme nicht mehr haben.
_Rolf_
--
sumpsi - posui - clusi
KW als Spalte einfügen
bearbeitet von Rolf BHallo Bernd,
wie Du dieses Problem löst, zeige ich Dir jetzt, weil es als Programmierlektion wichtig ist - **aber das kannst Du für deinen Kalender nicht verwenden!** Reginas Tipp hat einen unangenehmen Fehler (wenn sonst nichts im Beitrag stände, müsste ich dafür das [-] klicken). Erklärung folgt.
Du solltest das Erhöhen der Wochennummer und das Erstellen der Nummernspalte nicht trennen. Der Effekt ist bei Dir, dass beim ersten Wochenwechsel noch kein Inkrement stattgefunden hat. Entferne das $weekNumber++ vom Anfang der Schleife und setze es an dieser Stelle ein, ohne Bedingung (weil Du ja hier schon weißt dass ein Wochenwechsel vorliegt):
~~~php
// Neue Woche
$week = '';
$week .= '<td>'. $weekNumber .'</td>';
~~~
Und bei der Gelegenheit kannst Du auch das Leeren von $week und das Anhängen des ersten Inhaltes zu einem Befehl verbinden. Der Code müsste nach der Verschiebung so aussehen:
~~~php
// Neue Woche
$weekNumber++;
$week = '<td>'. $weekNumber .'</td>';
~~~
Das könnte man noch verkürzen (in bester C-Tradition: Einzeilige Programme beliebiger Komplexität), indem man den ++ Operator als Präfix einsetzt ($a++ und ++$a inkrementieren beide $a, aber $a++ liefert den alten und ++$a den neuen Wert von $a):
~~~php
// Neue Woche
$week = '<td>'. (++$weekNumber) .'</td>';
~~~
Die Klammer ist formal nicht nötig, die habe ich als Lesehilfe gesetzt.
#Warum Du das nicht verwenden kannst
2017 und 2016 hättest Du im Januar Probleme, weil da der 01.01. zur KW des vorigen Jahres gehört. Deine Wochen wären also von 52-56 oder von 53-57 gelaufen.
Dieses Jahr hättest Du im Dezember Probleme, weil Du den 31.12. in die KW 53 setzen würdest. Er liegt aber in KW 01-2019.
Am einfachsten ist es wohl, die KW pro Schleifendurchlauf neu von PHP bestimmen zu lassen. Und wenn Deine Programmstruktur in etwa der logischen Struktur der Ausgabe entspricht, tust Du Dich in einigem leichter! Als Leser tut man sich leichter, wenn Kommentare da sind die besagen, was da inhaltlich passiert. Ich habe mal ein paar eingefügt. Plus ein paar Kommentare mit technischen Hinweisen für Dich, die eine von dir bisher vorher nicht verwendete PHP Funktion erläutern.
~~~php
// Erzeugt ein Array mit den Elementen des Tagesdatums
$today = getDate();
// Bestimme Wochentag des letzten Tages im vorigen Monat. 0=So, 1=Mo, ... 6=Sa
$wDay = date('w', mktime(0,0,0,$today['mon'],0,$today['year']));
// $curDay ist der aktuell aufbereitete Kalendertag. Beginnt der Monat nicht mit
// dem Montag, wird $curDay soweit rückgerechnet dass es einem Montag entspricht. Der vorher ermittelte $wDay-Wert passt dafür prima.
$curDay = 1 - $wDay;
// Tage im laufenden Monan. In $today[0] steht der Unix-Timestamp
$day_count = date('t', $today[0]);
// Helper für die Date-Links
$ym = strftime("%Y-%m-", $today[0]);
while ($curDay <= $day_count) {
// mktime-Eigenschaft: Es rechnet Werte um, die außerhalb der erlaubten Bereich liegen.
// Der -4.09.2018 entspricht dem 27.08.
$week = "<td>"
. date("W", mktime(0,0,0,$today['mon'],$curDay,$today['year']))
. "</td>";
// $d ist einfach nur ein Zähler für 7 Tage.
for ($d=0; $d<7; $d++) {
if ($curDay < 1 || $curDay > $day_count) { // außerhalb des Monatszeitfensters
$week .= "<td></td>";
}
else {
$curDayFmt = sprintf("%02d",$curDay);
$week .= "<td><div><a href='day.php?date=$ym$curDayFmt'>$curDay</a></div></td>";
}
$curDay++;
}
$weeks[] = "<tr>" . $week . "</tr>";
$curDay++;
}
~~~
Der Code ist grob in [PHP Sandbox](http://sandbox.onlinephpfunctions.com/) getestet - aber keine Garantie für Korrektheit :). Er dürfte aber einige der bisherigen Probleme nicht mehr haben.
_Rolf_
--
sumpsi - posui - clusi
KW als Spalte einfügen
bearbeitet von Rolf BHallo Bernd,
wie Du dieses Problem löst, zeige ich Dir jetzt, weil es als Programmierlektion wichtig ist - **aber das kannst Du für deinen Kalender nicht verwenden!** Reginas Tipp hat einen unangenehmen Fehler (wenn sonst nichts im Beitrag stände, müsste ich dafür das [-] klicken). Erklärung folgt.
Du solltest das Erhöhen der Wochennummer und das Erstellen der Nummernspalte nicht trennen. Der Effekt ist bei Dir, dass beim ersten Wochenwechsel noch kein Inkrement stattgefunden hat. Entferne das $weekNumber++ vom Anfang der Schleife und setze es an dieser Stelle ein, ohne Bedingung (weil Du ja hier schon weißt dass ein Wochenwechsel vorliegt):
~~~php
// Neue Woche
$week = '';
$week .= '<td>'. $weekNumber .'</td>';
~~~
Und bei der Gelegenheit kannst Du auch das Leeren von $week und das Anhängen des ersten Inhaltes zu einem Befehl verbinden. Der Code müsste nach der Verschiebung so aussehen:
~~~php
// Neue Woche
$weekNumber++;
$week = '<td>'. $weekNumber .'</td>';
~~~
Das könnte man noch verkürzen (in bester C-Tradition: Einzeilige Programme beliebiger Komplexität), indem man den ++ Operator als Präfix einsetzt ($a++ und ++$a inkrementieren beide $a, aber $a++ liefert den alten und ++$a den neuen Wert von $a):
~~~php
// Neue Woche
$week = '<td>'. (++$weekNumber) .'</td>';
~~~
Die Klammer ist formal nicht nötig, die habe ich als Lesehilfe gesetzt.
#Warum Du das nicht verwenden kannst
2017 und 2016 hättest Du im Januar Probleme, weil da der 01.01. zur KW des vorigen Jahres gehört. Deine Wochen wären also von 52-56 oder von 53-57 gelaufen.
Dieses Jahr hättest Du im Dezember Probleme, weil Du den 31.12. in die KW 53 setzen würdest. Er liegt aber in KW 01-2019.
Am einfachsten ist es wohl, die KW pro Schleifendurchlauf neu von PHP bestimmen zu lassen. Und wenn Deine Programmstruktur in etwa der logischen Struktur der Ausgabe entspricht, tust Du Dich in einigem leichter!
~~~php
// Erzeugt ein Array mit den Elementen des Tagesdatums
$today = getDate();
// Bestimme Wochentag des letzten Tages im vorigen Monat. 0=So, 1=Mo, ... 6=Sa
$wDay = date('w', mktime(0,0,0,$today['mon'],0,$today['year']));
// $curDay ist der aktuell aufbereitete Kalendertag. Beginnt der Monat nicht mit
// dem Montag, wird $curDay soweit rückgerechnet dass es einem Montag entspricht. Der vorher ermittelte $wDay-Wert passt dafür prima.
$curDay = 1 - $wDay;
// Tage im laufenden Monan. In $today[0] steht der Unix-Timestamp
$day_count = date('t', $today[0]);
// Helper für die Date-Links
$ym = strftime("%Y-%m-", $today[0]);
while ($curDay <= $day_count) {
// mktime-Eigenschaft: Es rechnet Werte um, die außerhalb der erlaubten Bereich liegen.
// Der -4.09.2018 entspricht dem 27.08.
$week = "<td>"
. date("W", mktime(0,0,0,$today['mon'],$curDay,$today['year']))
. "</td>";
// $d ist einfach nur ein Zähler für 7 Tage.
for ($d=0; $d<7; $d++) {
if ($curDay < 1 || $curDay > $day_count) { // außerhalb des Monatszeitfensters
$week .= "<td></td>";
}
else {
$curDayFmt = sprintf("%02d",$curDay);
$week .= "<td><div><a href='day.php?date=$ym$curDayFmt'>$curDay</a></div></td>";
}
$curDay++;
}
$weeks[] = "<tr>" . $week . "</tr>";
$curDay++;
}
~~~
Der Code ist grob in [PHP Sandbox](http://sandbox.onlinephpfunctions.com/) getestet - aber keine Garantie für Korrektheit :). Er dürfte aber einige der bisherigen Probleme nicht mehr haben.
_Rolf_
--
sumpsi - posui - clusi
KW als Spalte einfügen
bearbeitet von Rolf B# Sorry, zu schnell gespeichert - IST NOCH IN ARBEIT
Hallo Bernd,
wie Du dieses Problem löst, zeige ich Dir jetzt, weil es als Programmierlektion wichtig ist - **aber das kannst Du für deinen Kalender nicht verwenden!** Reginas Tipp hat einen unangenehmen Fehler (wenn sonst nichts im Beitrag stände, müsste ich dafür das [-] klicken). Erklärung folgt.
Du solltest das Erhöhen der Wochennummer und das Erstellen der Nummernspalte nicht trennen. Der Effekt ist bei Dir, dass beim ersten Wochenwechsel noch kein Inkrement stattgefunden hat. Entferne das $weekNumber++ vom Anfang der Schleife und setze es an dieser Stelle ein, ohne Bedingung (weil Du ja hier schon weißt dass ein Wochenwechsel vorliegt):
~~~php
// Neue Woche
$week = '';
$week .= '<td>'. $weekNumber .'</td>';
~~~
Und bei der Gelegenheit kannst Du auch das Leeren von $week und das Anhängen des ersten Inhaltes zu einem Befehl verbinden. Der Code müsste nach der Verschiebung so aussehen:
~~~php
// Neue Woche
$weekNumber++;
$week = '<td>'. $weekNumber .'</td>';
~~~
Das könnte man noch verkürzen (in bester C-Tradition: Einzeilige Programme beliebiger Komplexität), indem man den ++ Operator als Präfix einsetzt ($a++ und ++$a inkrementieren beide $a, aber $a++ liefert den alten und ++$a den neuen Wert von $a):
~~~php
// Neue Woche
$week = '<td>'. (++$weekNumber) .'</td>';
~~~
Die Klammer ist formal nicht nötig, die habe ich als Lesehilfe gesetzt.
#Warum Du das nicht verwenden kannst
2017 und 2016 hättest Du im Januar Probleme, weil da der 01.01. zur KW des vorigen Jahres gehört. Deine Wochen wären also von 52-56 oder von 53-57 gelaufen.
Dieses Jahr hättest Du im Dezember Probleme, weil Du den 31.12. in die KW 53 setzen würdest. Er liegt aber in KW 01-2019.
Am einfachsten ist es wohl, die KW pro Schleifendurchlauf neu von PHP bestimmen zu lassen. Und wenn Deine Programmstruktur in etwa der logischen Struktur der Ausgabe entspricht, tust Du Dich in einigem leichter!
~~~php
// Erzeugt ein Array mit den Elementen des Tagesdatums
$today = getDate();
// Bestimme Wochentag des letzten Tages im vorigen Monat. 0=So, 1=Mo, ... 6=Sa
$wDay = date('w', mktime(0,0,0,$today['mon'],0,$today['year']));
// $curDay ist der aktuell aufbereitete Kalendertag. Beginnt der Monat nicht mit
// dem Montag, wird $curDay soweit rückgerechnet dass es einem Montag entspricht. Der vorher ermittelte $wDay-Wert passt dafür prima.
$curDay = 1 - $wDay;
// Tage im laufenden Monan. In $today[0] steht der Unix-Timestamp
$day_count = date('t', $today[0]);
// Helper für die Date-Links
$ym = $today['year'] . '.' . $today['mon'] . '.';
while ($curDay <= $day_count) {
// mktime-Eigenschaft: Es rechnet Werte um, die außerhalb der erlaubten Bereich liegen.
// Der -4.09.2018 entspricht dem 27.08.
$week = "<td>"
. date("W", mktime(0,0,0,$today['mon'],$curDay,$today['year']))
. "</td>";
for ($d=0; $d<7; $d++) {
if ($curDay < 1 || $curDay > $day_count) { // außerhalb des Monatszeitfensters
$week .= "<td></td>";
}
else {
$week .= "<td><div><a href='day.php?date=$ym-$curDay'</a></div></td>";
}
}
$weeks[] = "<tr>" . $week . "</tr>";
$curDay++;
}
~~~
_Rolf_
--
sumpsi - posui - clusi
KW als Spalte einfügen
bearbeitet von Rolf BHallo Bernd,
wie Du dieses Problem löst, zeige ich Dir jetzt, weil es als Programmierlektion wichtig ist - **aber das kannst Du für deinen Kalender nicht verwenden!** Reginas Tipp hat einen unangenehmen Fehler (wenn sonst nichts im Beitrag stände, müsste ich dafür das [-] klicken). Erklärung folgt.
Du solltest das Erhöhen der Wochennummer und das Erstellen der Nummernspalte nicht trennen. Der Effekt ist bei Dir, dass beim ersten Wochenwechsel noch kein Inkrement stattgefunden hat. Entferne das $weekNumber++ vom Anfang der Schleife und setze es an dieser Stelle ein, ohne Bedingung (weil Du ja hier schon weißt dass ein Wochenwechsel vorliegt):
~~~php
// Neue Woche
$week = '';
$week .= '<td>'. $weekNumber .'</td>';
~~~
Und bei der Gelegenheit kannst Du auch das Leeren von $week und das Anhängen des ersten Inhaltes zu einem Befehl verbinden. Der Code müsste nach der Verschiebung so aussehen:
~~~php
// Neue Woche
$weekNumber++;
$week = '<td>'. $weekNumber .'</td>';
~~~
Das könnte man noch verkürzen (in bester C-Tradition: Einzeilige Programme beliebiger Komplexität), indem man den ++ Operator als Präfix einsetzt ($a++ und ++$a inkrementieren beide $a, aber $a++ liefert den alten und ++$a den neuen Wert von $a):
~~~php
// Neue Woche
$week = '<td>'. (++$weekNumber) .'</td>';
~~~
Die Klammer ist formal nicht nötig, die habe ich als Lesehilfe gesetzt.
#Warum Du das nicht verwenden kannst
2017 und 2016 hättest Du im Januar Probleme, weil da der 01.01. zur KW des vorigen Jahres gehört. Deine Wochen wären also von 52-56 oder von 53-57 gelaufen.
Dieses Jahr hättest Du im Dezember Probleme, weil Du den 31.12. in die KW 53 setzen würdest. Er liegt aber in KW 01-2019.
Am einfachsten ist es wohl, die KW pro Schleifendurchlauf neu von PHP bestimmen zu lassen. Und wenn Deine Programmstruktur in etwa der logischen Struktur der Ausgabe entspricht, tust Du Dich in einigem leichter!
~~~php
// Erzeugt ein Array mit den Elementen des Tagesdatums
$today = getDate();
// Bestimme Wochentag des letzten Tages im vorigen Monat. 0=So, 1=Mo, ... 6=Sa
$wDay = date('w', mktime(0,0,0,$today['mon'],0,$today['year']));
// $curDay ist der aktuell aufbereitete Kalendertag. Beginnt der Monat nicht mit
// dem Montag, wird $curDay soweit rückgerechnet dass es einem Montag entspricht. Der vorher ermittelte $wDay-Wert passt dafür prima.
$curDay = 1 - $wDay;
// Tage im laufenden Monan. In $today[0] steht der Unix-Timestamp
$day_count = date('t', $today[0]);
// Helper für die Date-Links
$ym = $today['year'] . '.' . $today['mon'] . '.';
while ($curDay <= $day_count) {
// mktime-Eigenschaft: Es rechnet Werte um, die außerhalb der erlaubten Bereich liegen.
// Der -4.09.2018 entspricht dem 27.08.
$week = "<td>"
. date("W", mktime(0,0,0,$today['mon'],$curDay,$today['year']))
. "</td>";
for ($d=0; $d<7; $d++) {
if ($curDay < 1 || $curDay > $day_count) { // außerhalb des Monatszeitfensters
$week .= "<td></td>";
}
else {
$week .= "<td><div><a href='day.php?date=$ym-$curDay'</a></div></td>";
}
}
$weeks[] = "<tr>" . $week . "</tr>";
$curDay++;
}
~~~
_Rolf_
--
sumpsi - posui - clusi