Rolf B: KW als Spalte einfügen

Beitrag lesen

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):

        // 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:

        // 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):

        // 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.

// 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>";
}

Der Code ist grob in PHP Sandbox getestet - aber keine Garantie für Korrektheit :). Er dürfte aber einige der bisherigen Probleme nicht mehr haben.

#Ein weiterer Schritt - geh ihn wenn Du willst

Als weiteren Schritt könnte man jetzt noch einwenden, dass es falsch ist, Daten und HTML in einem zu generieren. EIGENTLICH müsste der bisher gezeigte Code eine Datenstruktur aufbauen, die einen Kalendermonat inclusive der Fülltage repräsentiert, und die dann im zweiten Schritt - da wo auch dein übriges HTML steht - als HTML dargestellt wird. Trennung von Fachlogik und Repräsentation heißt das Prinzip.

Dein $weeks-Array sollte geschlüsselt sein mit den Wochennummern, der Inhalt sollte ein Array sein mit den darzustellenden Tagen. Ein Tag ist entweder leer oder eine Tagesnummer (integer). Jahr und Monat könnten String-Keys von $weeks sein. Wobei - $weeks ist dann der falsche Name, besser wäre dann $calendar_month oder so.

D.h. das Basisgerüst ist dies (mit [] Operator statt ARRAY() ):

$calendar_month = [
   'year' => $today['year'],
   'month' => $today['mon'],
   'day_count' => $day_count,
   'weeks' => []
];   

und die Wocheneinträge erzeugst Du stumpf so:


while ($curDay <= $day_count) {
   $weekNr = date("W", mktime(0,0,0,$today['mon'],$curDay,$today['year']));
   $week = [];
   for ($d=0; $d<7; $d++) {
      $week[] = $curDay++;
   }
   $calendar_month['weeks'][$weekNr] = $week;
}

Und dann kannst Du in der HTML Aufbereitung alles weitere tun. Da gehört es hin. Also: prüfen ob die Tagesnummer im Monat liegt, formatieren des Links, entscheiden wie ein Tag außerhalb des Monats dargestellt werden soll. Die Wochen verarbeitest Du da mit der Key=>Value Version von foreach:

foreach ($calendar_month['weeks'] as $weekNr => $week) {
   ...
}

Rolf

--
sumpsi - posui - clusi
0 117

KW als Spalte einfügen

Barksalot
  • php
  1. 1
    Regina Schaukrug
    1. 0
      Barksalot
      1. 0
        Regina Schaukrug
        1. 0
          Barksalot
          1. 1
            Regina Schaukrug
            1. 0
              Barksalot
              1. 1
                Regina Schaukrug
                1. 0
                  Barksalot
              2. 0
                Rolf B
                • php
                • programmiertechnik
                1. 0
                  Barksalot
                  1. 0
                    Rolf B
                    1. 0
                      beatovich
                2. 0
                  Barksalot
                  1. 0
                    Rolf B
                    1. 0
                      Barksalot
                      1. 0
                        Rolf B
                      2. 1
                        Rolf B
                        1. 0
                          Barksalot
                      3. 0

                        Hier mal meine Vorgehensweise

                        Regina Schaukrug
                        1. 0

                          (Fortsetzung)

                          Regina Schaukrug
                        2. 0

                          2. Fortsetzung: Termine

                          Regina Schaukrug
                          1. 0
                            Barksalot
                            1. 0
                              Regina Schaukrug
                              1. 0
                                Barksalot
                                1. 0
                                  Regina Schaukrug
                                  1. 0
                                    Barksalot
                                    1. 0
                                      Regina Schaukrug
                                      1. 0
                                        Barksalot
                                        1. 0
                                          Regina Schaukrug
                                    2. 0
                                      Rolf B
                              2. 0
                                beatovich
                                1. 0
                                  Regina Schaukrug
                                  1. 0
                                    beatovich
                              3. 0
                                Regina Schaukrug
                              4. 0
                                Rolf B
                  2. 2
                    Rolf B
                  3. 2
                    Rolf B
                    1. 0
                      MudGuard
                      1. 0
                        Rolf B
                        1. 0
                          dedlfix
                      2. 0
                        Regina Schaukrug
                    2. 0
                      Barksalot
                      1. 0
                        Regina Schaukrug
                        1. 0
                          Barksalot
                          1. 0
                            Regina Schaukrug
                            1. 0
                              Barksalot
                      2. 0
                        Rolf B
                        1. 0
                          Barksalot
                          1. 0
                            Rolf B
                            1. 0
                              Barksalot
                              1. 0
                                Regina Schaukrug
                                1. 0
                                  Barksalot
                                  1. 0
                                    Regina Schaukrug
                                    1. 0
                                      Barksalot
                                      1. 0
                                        Regina Schaukrug
                                        1. 0
                                          Barksalot
                                          1. 0
                                            Regina Schaukrug
                                            1. 0
                                              Barksalot
                                              1. 0
                                                Regina Schaukrug
                                                1. 0
                                                  Barksalot
                                                  1. 0
                                                    Regina Schaukrug
                                                    1. 0
                                                      Barksalot
                                                      1. 0
                                                        Regina Schaukrug
                                                        1. 0
                                                          Barksalot
                                                          1. 0
                                                            Regina Schaukrug
                                                            1. 0
                                                              Barksalot
                                                              1. 0

                                                                Anmerkung zu $mysqli: KW als Spalte einfügen

                                                                Barksalot
                                                                1. 0
                                                                  Regina Schaukrug
                                                                  1. 0
                                                                    Barksalot
                                                                    1. 0
                                                                      Regina Schaukrug
                                                                      1. 0
                                                                        Barksalot
                                                                        1. 0
                                                                          Rolf B
                                                                        2. 0
                                                                          Regina Schaukrug
                                                                          1. 0
                                                                            Barksalot
                                                                            1. 0
                                                                              Regina Schaukrug
                                                                              1. 0
                                                                                Barksalot
                                                                                1. 0
                                                                                  Regina Schaukrug
                                                                                  1. 0
                                                                                    Barksalot
                                                                                2. 0
                                                                                  Barksalot
                                                                                  1. 0
                                                                                    Rolf B
                                                                                    1. 0
                                                                                      Barksalot
                                                                                      1. 1
                                                                                        Regina Schaukrug
                                                                                        1. 0
                                                                                          Barksalot
                                                                                          1. 0
                                                                                            Rolf B
                                                                                      2. 0
                                                                                        Rolf B
                                                                                        1. 0
                                                                                          Barksalot
                                                                                  2. 0
                                                                                    Regina Schaukrug
                                                                                    1. 0
                                                                                      Barksalot
                                                                                      1. 0
                                                                                        Regina Schaukrug
                                                                                        1. 0
                                                                                          Barksalot
                                                                                          1. 0
                                                                                            Regina Schaukrug
                                                                                            1. 0
                                                                                              Barksalot
                                                                                              1. 0
                                                                                                Rolf B
                                                                                              2. 0
                                                                                                Regina Schaukrug
                                                                2. 0
                                                                  Rolf B
                                                                  1. 0
                                                                    Barksalot
                                                                    1. 0
                                                                      Rolf B
                3. 0
                  pl
                  • perl
                  • programmiertechnik
                  1. 0
                    Rolf B
                    1. 0
                      pl
                    2. 0
                      pl
          2. 0

            Einträge anordnen

            Barksalot
            1. 0
              pl
              1. 0
                Barksalot
                1. 0
                  Rolf B
                  1. 0
                    pl
  2. 1

    Danke!

    Barksalot
    1. 1
      Rolf B
      1. 0
        Barksalot
        1. 0
          Rolf B
          1. 0

            Grundsatzdiskussion bind ./. fetch_assoc und prepare ./. mysqli_real_escape_string

            Regina Schaukrug
            1. 0
              Rolf B
              1. 0
                Barksalot
                1. 0
                  Regina Schaukrug
                  1. 0
                    Rolf B
                    1. 0

                      Humor...

                      Regina Schaukrug
                      • menschelei