PHP-Logo

PHP-Kurs


Beispiele

kleiner Kalender

Dieses Skript gibt einen kleinen Kalender aus.

In Zeile 2 wird der Zeitstempel abgerufen.
In Zeile 4 wird das aktuelle Datum abgerufen und formatiert. In Zeile 5 wird das Datum ausgegeben. Näheres hierzu s. Datums-Funktionen.

In Zeile 11 werden die Tage des aktuellen Monats gezählt.

In Zeile 15 wird ein Array mit den deutschen Monatsnamen angelegt.

In Zeile 13 wurde der aktuelle Wochentag mit einer Datumsfunktion ermittelt. Die Datumsfunktion gibt Zahlen für die Wochentage zurück: Bei dieser Funktion beginnt die Woche mit Sonntag = 0 und endet mit Samstag = 6.
In Zeile 24 wird der Wochentag des Monatsersten ermittelt, indem der zuvor berechnete Zeitstempel für den Monatsersten mit Abfrage des Wochentags aufgelöst wird.
In den Zeilen 26 - 28 sorgt eine IF-Schleife dafür, dass der Sonntag die Zahl 7 erhält, denn in dem Kalender soll die Woche mit dem Montag beginnen.

In Zeile 34 wird als Überschrift für den Kalender aus dem Array mit den Monatsnamen der aktuelle Monat ausgelesen.
Da der Januar in dem Array den Schlüssel 0 hat, wurde in Zeile 17 die Zahl für den aktuellen Monat - 1 gerecht.
Die Datumsfunktion in Zeile 8 gibt für den Januar die 1 usw. zurück.

Den Kalender habe ich im Juli 2020 geschrieben. An diesem konkreten Beispiel lässt sich besser erklären, was in dem Skript passiert, als rein theoretisch:

Für den Monatsersten im Juli 2020 gibt die Datumsfunktion in Zeile 24 eine 3 zurück, denn der 1. Juli 2020 war ein Mittwoch.
Somit beginnt der Kalender mit zwei leeren Tabellenfeldern.
Die FOR-Schleife in den Zeilen 41 - 44 errechnet dies, da $x den Startwert 1 hat und $erster_wochentag = 3 ist. $x soll kleiner als 3 bleiben, somit entstehen zwei leere Tabellenfelder.
Da die Woche 7 Tage hat, müssen die restlichen 5 Felder mit Zahlen gefüllt werden:
Dass es 5 sind, wird in Zeile 39 errechnet: $erster_wochentag = 3, somit ist $zeile_1 = 5.
Die FOR-Schleife in den Zeilen 47 - 56 produziert die 5 Felder und trägt die Zahlen 1 - 5 ein.
Die IF/ELSE-Schleife in den Zeilen 50 - 54 prüft, ob die einzutragende Zahl dem aktuellen Tag entspricht. Dieser wurde in Zeile 7 ermittelt.
Ist dies der Fall, wird die einzutragende Zahl fett ausgezeichnet.

In den Zeilen 65 und 66 wird ermittelt, wie viele Wochen noch komplett mit Zahlen zu füllen sind.
Hierzu wird von der Gesamtzahl der Tage des aktuellen Monats (Zeile 11) das Tagesdatum des ersten Sonntags ($z_1 am Ende der FOR-Schleife in den Zeilen 47 - 56) im Monat abgezogen und durch 7 geteilt. Konkret:
Der erste Sonntag im Juli 2020 war der 5. Juli. $volle_wochen = ($anz_tage - $z_1) / 7 bedeutet also $volle_wochen = (31 - 5) / 7.
$volle_wochen = 3,714285714285714
Mittels floor( ) werden in Zeile 66 die Kommastellen abgeschnitten, somit ist $volle_wochen = 3.

Für diese 3 Wochen sollen je eine Tabellenzeile entstehen, die mit den fortlaufenden Zahlen für die Tage des Monats gefüllt sind.
Dies geschieht in der FOR-Schleife (hier mit FOR 03 gekennzeichnet) die in Zeile 69 beginnt und in Zeile 97 endet.
In den Zeilen 70 und 95 stehen jeweils der Beginn und das Ende der Tabellenzeile.

In Zeile 71 werden zur Aufnahme der Tagesdaten der 3 Wochen 3 Arrays definiert. Dies geschieht mittels variabler Variablen-Namen, da $vw bei jedem Durchlauf der FOR-Schleife eins größer wird.

In Zeile 72 wird $m als $vw * 7 definiert.
Dies dient zusammen mit $j in Zeile 75 innerhalb von FOR 04 dem Zweck, dass die richtigen Werte in die Arrays eingetragen werden.
Beim 1. Durchlauf von FOR 03 steht $vw auf 0. Somit ist $m = $vw * 7 = 0.
Beim 2. Durchlauf von FOR 03 steht $vw auf 1. Somit ist $m = $vw * 7 = 7.
Beim 3. Durchlauf von FOR 03 steht $vw auf 2. Somit ist $m = $vw * 7 = 14.

FOR 04, Zeile 74 - 78, läuft beim ersten Durchlauf von FOR 03 7x durch.
Somit ergeben sich für die Werte von $j = $i + 1 + $m in Zeile 75 folgende Werte:
1. $j = 0 + 1 + 0 = 1 dies bedeutet für $naechster_tag in Zeile 76: $z_1 + $j = 5 + 1 = 6
2. $j = 1 + 1 + 0 = 2 // $naechster_tag = 5 + 2 = 7
3. $j = 2 + 1 + 0 = 3 // $naechster_tag = 5 + 3 = 8
4. $j = 3 + 1 + 0 = 4 // $naechster_tag = 5 + 4 = 9
5. $j = 4 + 1 + 0 = 5 // $naechster_tag = 5 + 5 = 10
6. $j = 5 + 1 + 0 = 6 // $naechster_tag = 5 + 6 = 11
7. $j = 6 + 1 + 0 = 7 // $naechster_tag = 5 + 7 = 12

Diese Werte werden in das Array $tage_vw_0 eingetragen.
Würde man das Array mit print_r( ) auflösen, erhielte man folgende Ausgabe:
Array ( [0] => 6 [1] => 7 [2] => 8 [3] => 9 [4] => 10 [5] => 11 [6] => 12 )

Da beim zweiten Durchlauf von FOR 03 $m = 7 ist, ergeben sich für $naechster_tag folgende Werte, die in das Array $tage_vw_1 eingetragen werden:
Array ( [0] => 13 [1] => 14 [2] => 15 [3] => 16 [4] => 17 [5] => 18 [6] => 19 )

Beim dritten Durchlauf von FOR 03 ist $m = 14.
Dies bedeutet für Array $tage_vw_2:
Array ( [0] => 20 [1] => 21 [2] => 22 [3] => 23 [4] => 24 [5] => 25 [6] => 26 )

Die Werte werden in Zeile 77 mittels array_push( ) in das jeweilige Array eingetragen.

In der FOR-Schleife in den Zeilen 81 - 91 (hier FOR 05) werden die Arrays $tage_vw_0 bis $tage_vw_2 aufgelöst und die Werte in Tabellenfelder verpackt.
Die IF/ELSE-Schleife in den Zeilen 83 - 89 prüft, ob die Zahl dem aktuellen Tagesdatum entspricht und zeichnet sie in diesem Fall fett aus.

${'tage_vw_'.$vw}[$q] in Zeile 83, 85 und 87 fragt die entsprechenden Array-Einträge ab:
Wir befinden uns noch in der FOR 03 - Schleife, die im konkreten Fall 3x durchläuft.
Somit wird ${'tage_vw_'.$vw} beim ersten Durchlauf zu $tage_vw_0, beim zweiten zu $tage_vw_1 und beim dritten zu $tage_vw_2.

$q in Zeile 81 hat den Startwert 0 und läuft 7x durch, bis es den Wert 6 hat.
So lassen sich über die Schlüssel die Werte der Arrays auslesen:
${'tage_vw_'.$vw}[$q] wird beim 1. Durchlauf von FOR 03 zu $tage_vw_0[0] = 6 (s.o.), zu $tage_vw_0[1] = 7 usw. bis $tage_vw_0[6] = 12.
${'tage_vw_'.$vw}[$q] wird beim 2. Durchlauf von FOR 03 zu $tage_vw_1[0] = 13 (s.o.), zu $tage_vw_1[1] = 14 usw. bis $tage_vw_1[6] = 19.
${'tage_vw_'.$vw}[$q] wird beim 3. Durchlauf von FOR 03 zu $tage_vw_2[0] = 20 (s.o.), zu $tage_vw_2[1] = 21 usw. bis $tage_vw_2[6] = 26.

Um den letzten Wert der vollständigen Wochen zu behalten, wird in Zeile 93 $letzter_vw = ${'tage_vw_'.$vw}[6] definiert.
Dies ist zwar nicht zwingend erforderlich, erleichtert aber später den Überblick, da die variablen Variablen-Namen etwas unübersichtlich sind.

Lässt man in Zeile 98 $vw mit echo ausgeben, stellt man fest, dass der Wert 3, also 1 zuviel ist.
Das liegt daran, dass FOR 03 erst noch einmal den Schleifenschritt $vw++ durchführt, bevor es feststellt, dass die Bedingung $vw < $volle_wochen (= 3) dann nicht mehr erfüllt ist.

Darum wird in Zeile 99 $vw = $vw - 1 gerechent.

Die letzte Zeile des Kalenders wird u.U. nicht gebraucht, wenn es sich z.B. um einen Februar mit 28 Tagen handelt, dessen Monatserster ein Montag ist.
Daher beginnt in Zeile 101 eine IF-Schleife. Die letzte Zeile soll nur geschaffen werden, wenn sie nötig ist.
Zu diesem Zweck wird in der IF-Bedingung geprüft, ob der letzte Tag der vollen Wochen kleiner ist, als die Anzahl der gesamten Tage des Monats (Zeile 11).

Ist dies der Fall, wird in Zeile 102 die letzte Tabellenzeile geöffnet und in Zeile 127 wieder geschlossen.
In Zeile 104 wird berechnet, wie viele Tage der letzten Woche noch zum aktuellen Monat gehören.

Diesen Wert greift die FOR-Schleife (FOR 06) in Zeile 106 auf und produziert die entsprechende Anzahl an Tabellenfeldern, die mit den Tagesdaten bis zum Monatsende gefüllt werden.
In den Zeilen 108 und 109 wird das erste Tagesdatum der letzten Woche $lw ermittelt.
Da die Startbedingung von FOR 06 $h = 0 lautet, wird zunächst $lw = $h + 1 gerechnet.
Dann folgt die Addition in der $lw = $lw + $letzter_vw (letzter Tag der vollen Woche, Zeile 93), was im konkreten Fall $lw = 27 ergibt.
Die IF-Schleife in den Zeilen 111 bis 116 sorgt dafür, dass das aktuelle Tagesdatum fett ausgezeichnet wird.

In Zeile 120 wird ermittelt, wie viele leere Felder hinter dem Monatsletzten noch benötigt werden, um eine saubere HTML-Tabelle zu erhalten.
Diese werden von der FOR-Schleife (FOR 07) in den Zeilen 122 bis 125 produziert.

1<?php
2$zeitstempel = time();
3
4$datum = date("d.m.Y - H:i:s");
5echo $datum."<br>";
6
7$tag = date("d");
8$monat = date("n"); //ohne führende Null
9$jahr = date("Y");
10
11$anz_tage = cal_days_in_month ( CAL_GREGORIAN, $monat, $jahr );
12
13$w = date("w");//Wochentag als Zahl: So. = 0 / Sa. = 6
14
15$monatsname = array("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");
16
17$monat_aktuell = $monat -1;
18
19$minus = $tag -1; //ermittelt die Differenz in Tagen zum Monatsersten
20$minus_zst = $minus * 86400; //wandelt die Differenz in Tagen in Sekunden um
21
22$erster = $zeitstempel - $minus_zst;
23
24$erster_wochentag = date("w", $erster);//löst zeitstempel ($erster) auf
25
26if($erster_wochentag == 0){//------------------------------------------------------IF A Anfang
27$erster_wochentag = 7;
28}//--------------------------------------------------------------------------------IF A Ende
29
30
31//---------------------------------------------------------------------------------Tabelle 01 Anfang
32
33
34echo"<table border='1'><tr bgcolor='#e0e0e0'><td colspan='7'><b>".$monatsname[$monat_aktuell]." ".$jahr."</b></td></tr>";
35echo"<tr bgcolor='#f0f0f0'><td><b>MO</b></td><td><b>DI</b></td><td><b>MI</b></td><td><b>DO</b></td><td><b>FR</b></td><td><b>SA</b></td><td><b>SO</b></td></tr>";
36
37echo"<tr>";
38
39$zeile_1 = 8 - $erster_wochentag;
40
41for($x=1; $x<$erster_wochentag; $x++){//-------------------------------------------FOR 01 Anfang
42
43echo"<td> </td>";
44}//--------------------------------------------------------------------------------FOR 01 ENDE
45
46
47for ($y=0; $y<$zeile_1; $y++){//---------------------------------------------------FOR 02 Anfang
48 $z_1 = $y +1;
49
50if($z_1 == $tag){//---------------------------------------------------IF/ELSE aktueller Tag 01 Anfang
51 echo"<td><b>".$z_1."</b></td>";
52}else{
53 echo"<td>".$z_1."</td>";
54 }//-------------------------------------------------------------IF/ELSE aktueller Tag 01 Ende
55
56}//--------------------------------------------------------------------------------FOR 02 Ende
57
58echo"</tr>\n";//-------------------------------------------------------------------ENDE ZEILE 1
59
60//=================================================================================================
61
62
63
64
65$volle_wochen = ($anz_tage - $z_1)/7;
66$volle_wochen = floor($volle_wochen);//schneidet Kommastellen ab
67
68
69for($vw = 0; $vw < $volle_wochen; $vw++){//-------------------------------------FOR 03 Anfang
70echo"<tr>";
71${'tage_vw_'.$vw}= array();
72 $m = $vw*7;
73
74 for($i = 0; $i<7; $i++){//---------------------------------------------------FOR 04 Anfang
75 $j = $i+1+$m;
76 $naechster_tag = $z_1 + $j;
77 array_push(${'tage_vw_'.$vw}, $naechster_tag);
78 }//--------------------------------------------------------------------------FOR 04 Ende
79
80
81 for($q = 0; $q<7; $q++){//---------------------------------------------------FOR 05 Anfang
82
83if(${'tage_vw_'.$vw}[$q]==$tag){//--------------------------------IF/ELSE aktueller Tag 02 Anfang
84
85 echo"<td><b>".${'tage_vw_'.$vw}[$q]."</b></td>";
86}else{
87echo"<td>".${'tage_vw_'.$vw}[$q]."</td>";
88
89}//---------------------------------------------------------------IF/ELSE aktueller Tag 02 Ende
90
91 }//--------------------------------------------------------------------------FOR 05 Ende
92
93$letzter_vw = ${'tage_vw_'.$vw}[6];
94
95echo"</tr>\n";//----------------------------------------------------------------ENDE ZEILE 2
96
97}//-----------------------------------------------------------------------------FOR 03 Ende
98//echo $vw; // (einer zu viel)
99$vw = $vw-1;
100
101if(${'tage_vw_'.$vw}[6]<$anz_tage){//-------------------------------------------IF letzte Zeile Anfang
102echo"<tr>";
103
104$letzte_woche = $anz_tage - $letzter_vw;
105
106for($h = 0; $h<$letzte_woche; $h++){//------------------------------------------FOR 06 Anfang
107
108$lw = $h+1;
109$lw = $lw + $letzter_vw;
110
111if($lw == $tag){//-----------------------------------------------IF/ELSE aktueller Tag 03 Anfang
112
113echo"<td><b>".$lw."</b></td>";
114}else{
115echo"<td>".$lw."</td>";
116}//-----------------------------------------------------------------------IF/ELSE aktueller Tag 03 Ende
117
118}//-----------------------------------------------------------------------------FOR 06 Ende
119
120$leer_unten = 7 - $letzte_woche;
121
122for ($k = 0; $k<$leer_unten; $k++){//-------------------------------------------FOR 07 Anfang
123echo"<td> </td>";
124
125}//-----------------------------------------------------------------------------FOR 07 Ende
126
127echo"</tr>\n";//----------------------------------------------------------------ENDE ZEILE 3
128}//-----------------------------------------------------------------------------IF letzte Zeile Ende
129
130echo"</table>";
131//------------------------------------------------------------------------------Tabelle 01 Ende
132
133?>

Ausgabe des Skripts:

20.09.2020 - 12:41:22
September 2020
MODIMIDOFRSASO
123456
78910111213
14151617181920
21222324252627
282930

Einbindung des Skripts:

<html>
<head></head>

<body>

<?php

hier den PHP-Code einfügen

?>

</body>
</html>