PHP Kalender Problem mit Darstellung

Zero2000

Erfahrenes Mitglied
Hallo,

hab hier ein Problem bei dem ich nicht weiterkomme.
Ich habe einen Kalender der mir in einer Zeile alles komplett vom 01.01 bis 31.12. darstellt. Leider habe ich hier noch Probleme mit der Darstellung. Nachfolgend mal mein Code was ich bisher habe. Die Tabelle soll nur zeigen wie ich es gerne hätte, dient mir zur Gestaltung.
PHP:
<?php
setlocale(LC_TIME, 'de_DE', 'deu_deu');
$start = mktime(0, 0, 0, 1, 1, 2013);
$tagejahr = 365 + date('L', $start);

echo '<table border="0"><tr>';

for($i = 0; $i < $tagejahr; ++$i)
{
	
	if (strftime('%W', strtotime('+ '.$i.' day', $start))== '00')
	{
		$kalenderwoche = "KW 52";
	}else {
		$kalenderwoche = strftime('KW %W', strtotime('+ '.$i.' day', $start));
	}
	
	if ((($i+1)%7) == 5 || $i%7 == 5) {
                    $test = "class=alt";
                } else {
                    $test = "";
                }
				
	echo '<td '.$test.'>'.strftime('%B', strtotime('+ '.$i.' day', $start)).'<br>'.$kalenderwoche.'<br>'.strftime('%a<br>%d.', strtotime('+ '.$i.' day', $start)).'</td>';
}

echo "</tr></table>";  
?>
<table border="1" class="normal">
	<tr>
        <td colspan="4" align="center"><strong>Januar</strong></td>
        <td colspan="4" align="center"><strong>Februar</strong></td>
	</tr>
    <tr>
        <td align="center">KW 01</td>
        <td align="center">KW 02</td>
        <td align="center">KW 03</td>
        <td align="center">KW 04</td>
        <td align="center">KW 05</td>
        <td align="center">KW 06</td>
        <td align="center">KW 07</td>
        <td align="center">KW 08</td>
    </tr>
    <tr>
    	<td>
        
        <table border="1">
        	<tr>
            	<td>Di<br />01</td>
                <td>Mi<br />02</td>
                <td>Do<br />03</td>
                <td>Fr<br />04</td>
                <td>Sa<br />05</td>
                <td>So<br />06</td>
            </tr>
            <tr>
            	<td>U</td>
                <td>U</td>
                <td>U</td>
                <td>U</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
            </tr>
        </table>
        
        </td>
        <td>
        
        <table border="1">
        	<tr>
            	<td>Mo<br />07</td>
                <td>Di<br />08</td>
                <td>Mi<br />09</td>
                <td>Do<br />10</td>
                <td>Fr<br />11</td>
                <td>Sa<br />12</td>
                <td>So<br />13</td>
            </tr>
            <tr>
            	<td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
            </tr>
        </table>
        
        </td>
        <td>
        
        <table border="1">
        	<tr>
            	<td>Mo<br />14</td>
                <td>Di<br />15</td>
                <td>Mi<br />16</td>
                <td>Do<br />17</td>
                <td>Fr<br />18</td>
                <td>Sa<br />19</td>
                <td>So<br />20</td>
            </tr>
            <tr>
            	<td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>K</td>
                <td>K</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
            </tr>
        </table>
        
        </td>
        <td>
        
        <table border="1">
        	<tr>
            	<td>Mo<br />21</td>
                <td>Di<br />22</td>
                <td>Mi<br />23</td>
                <td>Do<br />24</td>
                <td>Fr<br />25</td>
                <td>Sa<br />26</td>
                <td>So<br />27</td>
            </tr>
            <tr>
            	<td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
            </tr>
        </table>
        
        </td>
        
        <td>wie Jan</td>
        <td>wie Jan</td>
        <td>wie Jan</td>
        <td>wie Jan</td>
    </tr>
</table>
CSS:
<style type="text/css">
TD, TH, P {
     FONT-FAMILY: Arial, Verdana, Trebuchet MS, Helvetica;
     FONT-SIZE: 8pt;
     FONT-WEIGHT: none;
     COLOR: silver;
     BACKGROUND-COLOR: #FBFBFD;
}

P {
    BACKGROUND-COLOR: white;
}
.alt {BACKGROUND-COLOR: #E7E7F1; COLOR: red;}
.basic {COLOR: white; BACKGROUND-COLOR: #606096;}
.top {BACKGROUND-COLOR: #E7E7F1; COLOR: black; }
.white {BACKGROUND-COLOR: #FFFFFF;}
.blank {BACKGROUND-COLOR: white;}

A:link, A:visited, A:active {
    COLOR: #000020;
    TEXT-DECORATION: underline;
}
A:hover {
    COLOR: #FF4400;
}
.normal td {
	color: #000;
}
</style>
Ich komme absolut nicht weiter, hab keine Ahnung wie ich es hinbekomme das er den Monat nur einmal darstellt oder die Wochen auch nur einmal.
Vielleicht hat jemand ein Ansatzpunkt für mich?

LG Maik
 
Ist es denn überhaupt möglich den Kalender mit PHP so dar zu stellen wie ich es mir vorstelle?
HTML:
<table border="1" class="normal">
	<tr>
        <td colspan="4" align="center"><strong>Januar</strong></td>
        <td colspan="4" align="center"><strong>Februar</strong></td>
	</tr>
    <tr>
        <td align="center">KW 01</td>
        <td align="center">KW 02</td>
        <td align="center">KW 03</td>
        <td align="center">KW 04</td>
        <td align="center">KW 05</td>
        <td align="center">KW 06</td>
        <td align="center">KW 07</td>
        <td align="center">KW 08</td>
    </tr>
    <tr>
    	<td>
        
        <table border="1">
        	<tr>
            	<td>Mo<br />31</td>
                <td>Di<br />01</td>
                <td>Mi<br />02</td>
                <td>Do<br />03</td>
                <td>Fr<br />04</td>
                <td>Sa<br />05</td>
                <td>So<br />06</td>
            </tr>
            <tr>
            	<td>U</td>
                <td>U</td>
                <td>U</td>
                <td>U</td>
                <td>U</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
            </tr>
        </table>
        
        </td>
        <td>
        
        <table border="1">
        	<tr>
            	<td>Mo<br />07</td>
                <td>Di<br />08</td>
                <td>Mi<br />09</td>
                <td>Do<br />10</td>
                <td>Fr<br />11</td>
                <td>Sa<br />12</td>
                <td>So<br />13</td>
            </tr>
            <tr>
            	<td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
            </tr>
        </table>
        
        </td>
        <td>
        
        <table border="1">
        	<tr>
            	<td>Mo<br />14</td>
                <td>Di<br />15</td>
                <td>Mi<br />16</td>
                <td>Do<br />17</td>
                <td>Fr<br />18</td>
                <td>Sa<br />19</td>
                <td>So<br />20</td>
            </tr>
            <tr>
            	<td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>K</td>
                <td>K</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
            </tr>
        </table>
        
        </td>
        <td>
        
        <table border="1">
        	<tr>
            	<td>Mo<br />21</td>
                <td>Di<br />22</td>
                <td>Mi<br />23</td>
                <td>Do<br />24</td>
                <td>Fr<br />25</td>
                <td>Sa<br />26</td>
                <td>So<br />27</td>
            </tr>
            <tr>
            	<td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
            </tr>
        </table>
        
        </td>
        
        <td>wie Jan</td>
        <td>wie Jan</td>
        <td>wie Jan</td>
        <td>wie Jan</td>
    </tr>
</table>
Ich probiere da schon ewig dran rum und in Google's unendlichen Weiten gibt es in dieser Form nicht mal fertige Programme. (Oder ich finde Sie nicht) Vielleicht erbarmt sich ja doch jemand mit ein paar Ansätzen, Bitte

Schönen Männer- bzw. Vatertag
Maik
 
Was willst du erreichen? Kalender werden meistens mit JS dargestellt. Aber natürlich geht es auch mit PHP/HTML/CSS. Beschreib mal genau, was du da achen willst. Ich habe keine Lust, mich durch den Code zu wühlen....
 
So, erstmal das Bild, damit man sich das besser vorstellen kann.

Die Darstellung muss so sein oder kann auch anders sein?
Denn beispielsweise fehlen ja die letzten Tage vom Januar und werden in den Februar gedrückt.
Das kann ja auch nicht richtig sein.
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    42,5 KB · Aufrufe: 34
Ist es denn überhaupt möglich den Kalender mit PHP so dar zu stellen wie ich es mir vorstelle? ...
Hallo,
klar ist das möglich, auch ohne Tabellen zu verschachteln. Mach dir am besten ein Jahreskalendarium als Array (oder auch als XML). Für die Monats-, Wochen- und Tageszeile kannst du dann das Array separat durchlaufen und jeweils eine Tabellenzeile für den Jahreskalender generieren.
 
Die Darstellung muss so sein oder kann auch anders sein?
Kann natürlich auch anders sein, sollte aber alles für ein Jahr in einer Zeile stehen. Vielleicht ist es auch besser die Wochen weg zu lassen? Ich glaube das macht die ganze Sache einfacher.
Denn beispielsweise fehlen ja die letzten Tage vom Januar und werden in den Februar gedrückt.
Jetzt wo Du es sagst, verdammt.:eek:

@hela
wie sollte das Array denn dann aussehen, das wird dann ein multidimensionales Array werden denke ich mal oder?
 
... wie sollte das Array denn dann aussehen, das wird dann ein multidimensionales Array werden denke ich mal oder?
Hallo,
das muss nicht unbedingt ein multidimensionales Array sein. Eigentlich reicht auch ein flaches, etwa so:
PHP:
$year = 2011;

// Jahreskalendarium als Array:
///////////////////////////////
// Jul.Tag des ersten und des letzten Tages im Jahr:
$firstJD = cal_to_jd(0,1,1,$year);
$lastJD = cal_to_jd(0,12,31,$year);

// Array erzeugen:
for($jd=$firstJD; $jd<=$lastJD; $jd++)
{
  $arrDate = cal_from_jd($jd,0);
  $arrDaysInYear[$jd]['year'] = $year;
  $arrDaysInYear[$jd]['month'] = $arrDate['month'];
  $arrDaysInYear[$jd]['week'] = date('W',jdtounix($jd));
  $arrDaysInYear[$jd]['day'] = $arrDate['day'];
  $arrDaysInYear[$jd]['dow'] = $jd % 7 + 1;  /* DayOfWeek » Wochentag (1..7) */
}
Bei der Ausgabe sieht das dann so aus:
Code:
Array
(
    [2455563] => Array
        (
            [year] => 2011
            [month] => 1
            [week] => 52
            [day] => 1
            [dow] => 6
        )
    [2455564] => Array
        (
            [year] => 2011
            [month] => 1
            [week] => 52
            [day] => 2
            [dow] => 7
        )
    [2455565] => Array
        (
            [year] => 2011
            [month] => 1
            [week] => 01
            [day] => 3
            [dow] => 1
        )

// usw. usf...

    [2455926] => Array
        (
            [year] => 2011
            [month] => 12
            [week] => 52
            [day] => 30
            [dow] => 5
        )
    [2455927] => Array
        (
            [year] => 2011
            [month] => 12
            [week] => 52
            [day] => 31
            [dow] => 6
        )

)
 
Hallo,
ich schäme mich ja so, aber ich komme hier echt nicht weiter.

@hela
Deine Variante finde ich echt nicht schlecht, so habe ich alles in einem Array. Habs auch schon ein wenig angepasst. Was mir einfach fehlt ist das Verständnis aus diesem Array nun die Daten zu verwerten. Mache ich das indem ich die jeweiligen Ausgaben in einer foreach-Schleife nochmal durchlaufen lassen muss?

Wenn ich das so verwende:
PHP:
// Array erzeugen:
echo '<table border="1" cellspacing="1" cellpadding="0">';
echo '<TR>';

for($jd=$firstJD; $jd<=$lastJD; $jd++) 
{ 
  
  echo "<td>".$arrDaysInYear[$jd]['Monat'] = $monate[date('m',jdtounix($jd))]."</td>";
  $arrDaysInYear[$jd]['KW'] = date('W',jdtounix($jd));
  $arrDaysInYear[$jd]['Jahr'] = $year;
  $arrDaysInYear[$jd]['Tag'] = date('d',jdtounix($jd));
  $arrDaysInYear[$jd]['W-Tag'] = $wochentage[$jd % 7 + 1];  /* DayOfWeek » Wochentag (1..7) */
  $arrDaysInYear[$jd]['Anz.Tage'] = date('t',jdtounix($jd));
  
}  
echo '</TR>';
echo '</table>';
bekomme ich 31x den Januar, 28x den Februar u.s.w. Die Monate benötige ich aber doch nur einmal. Habs schon mit array_unique versucht was aber nicht funktioniert hat.

Kann man mich vielleicht wie eine Billardkugel nochmal in die richtige Richtung stubsen?

LG
Maik
 
Hallo,

Ich bin schon mal einen Schritt weiter.
Habe einfach die erzeugten Arrays in jeweils ein neues Array gepackt und dann die Monate und KW mit array_unique zusammengefasst.
Das ganze sieht bis jetzt so aus:
PHP:
$year = 2013; 

// Jahreskalendarium als Array: 
///////////////////////////////
// Wochentage in gewünschter Reihenfolge
$wochentage = array ('1'=>"Mo", "Di", "Mi", "Do", "Fr", "Sa", "So");
// Monate
$monate = array("01" => 'Januar',"02" => 'Februar',"03" => 'März',"04" => 'April',"05" => 'Mai',"06" => 'Juni',"07" => 'Juli',"08" => 'August',"09" => 'September',"10" => 'Oktober',"11" => 'November',"12" => 'Dezember');
// Jul.Tag des ersten und des letzten Tages im Jahr: 
$firstJD = cal_to_jd(0,1,1,$year); 
$lastJD = cal_to_jd(0,12,31,$year); 

// Array erzeugen:
for($jd=$firstJD; $jd<=$lastJD; $jd++) 
{ 
  $kw[] = $arrDaysInYear[$jd]['KW'] = date('W',jdtounix($jd));
  $tag[] = $arrDaysInYear[$jd]['Tag'] = date('d',jdtounix($jd));
  $wtag[] = $arrDaysInYear[$jd]['W-Tag'] = $wochentage[$jd % 7 + 1];  /* DayOfWeek » Wochentag (1..7) */
  $arrDaysInYear[$jd]['Anz.Tage'] = date('t',jdtounix($jd));
  $monat[] = $arrDaysInYear[$jd]['Monat'] = $monate[date('m',jdtounix($jd))];
}  

$kw = array_unique($kw);
$monat = array_unique($monat);

echo '<table border="1" cellspacing="1" cellpadding="0">';
echo '<TR>';

foreach($monat as $mein_monat)
{
  echo "<td><strong>".$mein_monat."</strong></td>";
}

echo "</tr><tr>";

foreach($kw as $meine_kw)
{
  echo "<td>KW ".$meine_kw."</td>";
}

echo "</tr><tr>";

foreach($tag as $mein_tag)
{
  echo "<td>".$mein_tag."</td>";
}

echo '</TR>';
echo '</table>';


var_dump($tag);
echo "<br>";
var_dump($arrDaysInYear);

?>
Noch nicht perfekt, ich weiß im Moment auch gar nicht wie ich welche Schleife wohin packen muß damit es dann aussieht wie ich es haben will.

Hilfe ist nach wie vor willkommen.

LG
Maik
 
Hallo,

ich würde bei jedem Durchlauf des Jahresarrays eine Tabellenzeile (Monatszeile, Wochenzeile, Tageszeile und ...) anlegen:

1. Monatszeile ausgeben:
Vor dem Arraydurchlauf wird ein Array mit den Monatsnamen angelegt und zwei Variablen initialisiert: In die Variable $currVal wird der aktuelle Monatswert festgehalten, damit kann beim Durchlauf eine Änderung des Monatswertes registriert werden. Die Variable $dayCount zählt die Tage im aktuellen Monat, bei Monatswechsel wird sie auf 1 gesetzt. Bei jedem Monatswechsel und am Ende des Arraydurchlaufs wird eine Tabellenzelle ausgegeben.

2. Wochenzeile ausgeben:
Gleiches Strickmuster wie bei der Ausgabe der Monatszeile, nur dass statt der Monate die Wochenwerte kontrolliert werden.​

3. Tageszeile ausgeben ist einfach:
Jedes Arrayelement erzeugt eine Tabellenzelle mit dem Wert des Wochen- und Monatstages.​

Zusammen sieht das etwa so aus:
PHP:
// Jahresarray als Tabelle ausgeben:
////////////////////////////////////
echo '<table border="1">';

// Monatszeile ausgeben:
// ---------------------
$arrMonthName = array('0','Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember');
$currVal = 0;                  /* akt. Monatswert  initialisieren */
$dayCount = 0;                 /* Tageszähler initialisieren */
echo '<tr>';
foreach($arrDaysInYear as $val)
{
  if($val['month'] == $currVal)
    $dayCount++;               /* Tage im akt. Monat zählen */
  else
  {
    if($dayCount > 0)          /* Tabellenzelle ausgeben: */
      echo '<th colspan="', $dayCount, '">', $arrMonthName[$currVal], '</th>';
    $currVal = $val['month'];  /* Monatswert aktualisieren */
    $dayCount = 1;             /* Tageszähler rücksetzen */
  }
}
echo '<th colspan="', $dayCount, '">', $arrMonthName[$currVal], '</th></tr>';

// Wochenzeile ausgeben:
// ---------------------
$currVal = 0;                  /* akt. Wochenwert  initialisieren */
$dayCount = 0;                 /* Tageszähler initialisieren */
echo '<tr>';
foreach($arrDaysInYear as $val)
{
  if($val['week'] == $currVal)
    $dayCount++;               /* Tage in akt. Woche zählen */
  else
  {
    if($dayCount > 0)
      echo '<th colspan="', $dayCount, '">KW ', $currVal, '</th>';
    $currVal = $val['week'];   /* Wochenwert aktualisieren */
    $dayCount = 1;             /* Tageszähler rücksetzen */
  }
}
echo '<th colspan="', $dayCount, '">KW ', $currVal, '</th></tr>';

// Tageszeile ausgeben:
// ---------------------
echo '<tr>';
$arrDayOfWeekName = array('So','Mo','Di','Mi','Do','Fr','Sa','So');
foreach($arrDaysInYear as $val) {
  echo '<td>', $arrDayOfWeekName[$val['dow']], '<br>', $val['day'], '</td>';
}
echo '</tr>';

echo '</table>';

Bei der Ausgabe sieht die Tabelle für das Jahr 2013 bei mir dann so aus:
calRows.png
 
Zurück