while Schleifen mit str_repeat

chillibiggi

Grünschnabel
while Schleifen mit str_repeat //edit als Tabellenzelle ausgeben

Hallo ihr Fleißigen und Wissenden,

ich knobel schon seit einigen Tagen an einem Adventkalender für mein Board. Habe da ein Script, was ansich auch funktioniert. Nur leider wird die Ausgabe der einzelnen Tage mit
HTML:
<br>
untereinander ausgegeben.

Ich bin aber anspruchsvoll und möchte die 24 Tage in 4 Reihen a´ 6 Tage in einer Tabelle darstellen.

Bisher habe ich es geschafft per
PHP:
for
in 4 Schleifen das gewünschte Erscheinungsbild zu erzielen. Leider geht mir dabei aber die Überprüfung des aktuellen Tages verloren.

Schaubild:
Tage: 24 (darstellerisch in 4 x 6 Tage aufgeteilt)
Abfrage per
PHP:
date("j")
nach aktuellem Tag im Monat.
Bedingungen: wenn heute dann zeige heute und Tage vorher mit Link zum entsprechenden hinterlegten Inhalt. (das funktioniert per
PHP:
$d = $HTTP_GET_VARS["d"];
auch einwandfrei) und lasse Tage danach "geschlossen"

mit dieser while-Schleife aus dem Original-Code erhalte ich eine funktionierende Abfrage, aber wie gesagt nur untereinander in einer Reihe dargestellt.
PHP:
  if(!$d)
  {
  $countdown = 24 - date("j");
  $cnt_day = '1';
  while($cnt_day<=date("j"))
  {
   $days .= "<b>$cnt_day. Dezember</b><br />
   <a href=\"advent.php?d=$cnt_day\"><img src=\"./images/tuer_auf.gif\" border=\"0\"></a>  <br>";
   $cnt_day++;
  }
  while($cnt_day<=24)
  {
   $days .= "<b>$cnt_day. Dezember</b><br />
   <img src=\"./images/tuer_zu.gif\" alt=\"$cnt_day. Dezember\" title=\"$cnt_day. Dezember\" border=\"0\"><br>";
   $cnt_day++;
  }

Ausgabe $days im Template

Ich bin ein wenig ratlos - da ich mich irgendwie festgerannt habe mit "for" usw. Bin auch noch ein Anfänger in Schreiben von PHP-Code. Habe hier vor mir das "PHP4" - Buch von Dieter Staas liegen und http://www.php.net offen. Natürlich habe ich schon die Forensuche bemüht. Ebenfalls habe ich aus vorhanden Calenderscripten versucht mir eine Ableitung herauszusuchen. Aber leider ohne erstrebten Erfolg.

Wenn euch da eine Lösung einfällt wäre ich um eine ausführliche Erklärung dankbar, dass ich das endlich kapiere. Ich habe auch schon verschiedene Testscripts erstellt, damit ich mal hinter dieses "Schleifen-coden" komme.

Mit bestem Dank im Voraus.

P.S. habe da mal was von
PHP:
str_repeat
gesehen, habe aber die Anwendung nicht begriffen, mit welchen Funktionen bzw. Bedingungen das verknüpft ist.
 
Zuletzt bearbeitet:
Hallo.... für sowas lässt sich hervorragend eine Modulo-Division missbrauchen.

Du nimmst deinen Zähler $cnt_day und ermittelst den Rest der Ganzzahldivision durch 6.... ist dieser gleich 0, kannst du das <br> ausgeben.

Vom Prinzip her also so:
PHP:
<?php
$i = 1;
while($i <= 24)
  {
    echo ($i <= date("j"))
            ? ' türauf '
            : ' türzu ';
    if($i%6==0)echo '<br>';
    $i++;
  }
?>

[phpf]str_repeat[/phpf] dürfte dir da wenig weiterhelfen, das wiederholt lediglich eine beliebige Zeichenkette, Bsp:
PHP:
echo str_repeat('ho',3);
//Ausgabe:hohoho
 
Hallo Sven,

also dein Lösungsvorschlag ist ja schon mal gut, verkürzt den Code.

Aber ich check das nicht, dass ich das nicht in eine Tabelle formatiert bekomme

So hätte ich es gerne ausgegeben:
HTML:
<table>
	<tr>
		<td>Tag 1</td>
		<td>Tag 2</td>
		<td>Tag 3</td>
		<td>Tag 4</td>
		<td>Tag 5</td>
		<td>Tag 6</td>
	</tr>
		<tr>
		<td>Tag 7</td>
		<td>Tag 8</td>
		<td>Tag 9</td>
		<td>Tag 10</td>
		<td>Tag 11</td>
		<td>Tag 12</td>
	</tr>
		<tr>
		<td>Tag 13</td>
		<td>Tag 14</td>
		<td>Tag 15</td>
		<td>Tag 16</td>
		<td>Tag 17</td>
		<td>Tag 18</td>
	</tr>
		<tr>
		<td>Tag 19</td>
		<td>Tag 20</td>
		<td>Tag 21</td>
		<td>Tag 22</td>
		<td>Tag 23</td>
		<td>Tag 24</td>
	</tr>
</table>

Denn mit dem "<br>" habe ich das selbe wie vorher - alles untereinander, nur dass ich zwischen Tag 6 und Tag 7 noch ein "<br>" habe.

Entweder bin ich zu feminin das zu checken - oder ich habe da echt einen Denkfehler.

Weiters habe ich nun auch das Problem, dass die Ausgabe nicht an der Stelle im Layout ausgegeben wird, wie gewünscht. Es erscheint nun direkt am Seitenanfang => im Quelltext noch vor <head> :confused:

PHP:
  $countdown = 24 - date("j");
  $cnt_day = '1';
	
   while($cnt_day<=31)
 {	
 		echo ($cnt_day<= date("j"))
			? $days = "<b>$cnt_day. Dezember</b><br /><a href=\"advent.php?d=$cnt_day\"><img src=\"./images/tuer_auf.gif\" border=\"0\"></a><br />"
	   		: $days = "<b>$cnt_day. Dezember</b><br /><img src=\"./images/tuer_zu.gif\" alt=\"$cnt_day. Dezember\" title=\"$cnt_day. Dezember\" border=\"0\"><br />";
	   if ($cnt_day%6==0)echo "<br />";
	   $cnt_day++;
 }

Liefert: das hier

Wollte das heute eigentlich fertig haben *verzweifel*
 
Ahso..das mit der Tabelle hab ich wohl übersehen.:-(

Vom Prinzip her läuft es ähnlich.
Die Schleife packst du in so einen "Block"
Code:
<table><tr><?php schleife();?></tr></table>
bei jedem Schleifendurchlauf gibst du folgendes aus:
Code:
<td>dein Zellinhalt</td>
danach zusätzlich, wenn der Zähler durch 6 teilbar ist, jedoch nicht bei 24...
Code:
</tr><tr>
...fertig ist die Tabelle:)
PHP:
<table>
 <tr><?php
$i = 1;
while($i <= 24)
  {
    
    echo ($i <= date("j"))
            ? "\n  <td>türauf</td>"
            : "\n  <td>türzu</td>";
    
    if($i%6==0 && $i!=24)echo "\n </tr>\n <tr>";
    $i++;
  }
?> 
 </tr>
</table>


Warum das bei dir an der falschen Stelle erscheint, kann ich nicht sagen.... wenn du es dort notierst, wo es hinsoll, wird es auch da ausgegeben.
 
Du könntest das Ganze auch als Liste auszeichnen und diese anschließend mit CSS formatieren:
PHP:
<?php

	$countdown = 24 - date('j');
	$cnt_day = 1;

	echo '<ol id="adventskalender">';
	while( $cnt_day <= 24 ) {
		echo ( $cnt_day <= date('j') )
			? '<li>'.$cnt_day.'. Dezember<a href="advent.php?d='.$cnt_day.'"><img src="./images/tuer_auf.gif"></a></li>';
			: '<li>'.$cnt_day.'. Dezember<img src="./images/tuer_zu.gif" alt="',$cnt_day.'. Dezember" title="'.$cnt_day.'. Dezember"></li>';
		$cnt_day++;
	}
	echo '</ul><br class="clear">';

?>
Code:
ol#adventskalender {
	width:			100%;
	min-width:		42em;
	margin:			0;
	padding:		0;
	list-style:		none;
}
ol#adventskalender li {
	float:			left;
	margin:			.333em 0 .667em 2%;
	width:			14%;
	text-align:		center;
}
ol#adventskalender li img {
	border:			none;
	display:		block;
}
ol#adventskalender li a {
	display:		block;
}
.clear {
	clear:			both;
}
 
Danke Ihr Lieben,

da ist nur ein Problem - ich muß die Variable $day im Template ausgeben. Wenn ich da den Code mit der Schleife im Template einfüge, wird dieser im Klartext ausgeben.

Wie kann ich die Schleife in 1 Variable packe? Geht das mit
PHP:
function ausgabe($variable)
 
Hab da noch ein Problem mit dem "echo"

PHP:
$cnt_day = 1;
$days = '';
while($cnt_day <= 24)
  {
    echo ($cnt_day <= date("j"))
            ? $days .= "\n  <td align=\"center\"><b>$cnt_day. Dezember</b><br /><a href=\"advent.php?d=$cnt_day\"><img src=\"./images/tuer_auf.gif\" border=\"0\"></a><br /></td>"
            : $days .= "\n  <td align=\"center\"><b>$cnt_day. Dezember</b><br /><img src=\"./images/tuer_zu.gif\" alt=\"$cnt_day. Dezember\" title=\"$cnt_day. Dezember\" border=\"0\"><br /></td>";
    
    if($cnt_day%6==0 && $cnt_day!=24)echo $days .= "\n </tr>\n <tr class=\"mainpage\">";
    $cnt_day++;

}

  eval("\$tpl->output(\"".$tpl->get("advent")."\");");
  }

soweit prima, also die Tabellen werden so dargestellt, wie ich es gerne hätte.

Nur wird am Anfang der Seite der String nochmal ausgeben, aber immer +1

1
1
2
1
2
3
1
2
3
4
...
1
.....
24
alles untereinander
dann beginnt erst <head>

Das habe ich nur bei "echo".

Ich habe auch schon versucht die Schleife im Template selbst einzugeben, aber da bekomme ich immer den Code im Klartext geliefert :(

Im Template rufe ich die Sache wie folgt auf:
HTML:
<table cellpadding="{$style['tableincellpadding']}" cellspacing="{$style['tableincellspacing']}" border="{$style['tableinborder']}" style="width:{$style['tableinwidth']}" class="tableinborder">
	<tr class="tabletitle" id="tabletitle">
		<td colspan="6"><normalfont>Noch $countdown Tage bis Weihnachten!! Heute ist der $day. Dezember </font></td>
	</tr> 

<tr class="mainpage">
$days

</tr>
	<br>
</table>

Darüber ist die Headerinformation und darunter die Footerinf. Wie gesagt, ich bekomme auch an der Stelle, wo $day aufgerufen wird, das erwünschte Ergebnis, aber leider auch wie oben beschrieben den String als Schleife untereinander.

aufgerufen wird der Adventkalender ja mit der advent.php mit o. g. Inhalt. Auch wenn ich daraus eine advent.inc.php mache und von der advent.php aus aufrufe bekomme ich das o.g. Erscheinungsbild.

Wieso wird der Befehl "echo" schon vor den <head> - Tags ausgegeben?
 
So, nach einer recht schlaflosen Nacht und einigem Herumexperimentieren habe ich es geschafft.

Also da der Kalender ja in einem Template ausgegeben wird und dort ja automatisch das "echo" geparst wird, darf kein "echo" im Script stehen.

PHP:
   	$countdown = 24- $day; //24
	$cnt_day = 1;
	$days = '';
	$i = $cnt_day <= date("j");
	do{
	   $j = $cnt_day <= date("j")
	            ? $days .= "<td align=\"center\"><b>$cnt_day. Dezember</b><br /><a href=\"advent.php?d=$cnt_day\"><img src=\"./images/tuer_auf.gif\" border=\"0\"></a><br /></td>"
	            : $days .= "<td align=\"center\"><b>$cnt_day. Dezember</b><br /><img src=\"./images/tuer_zu.gif\" alt=\"$cnt_day. Dezember\" title=\"$cnt_day. Dezember\" border=\"0\"><br /></td>";
	    
	    if($cnt_day%6==0 && $cnt_day!=24) $days .= "\n </tr>\n <tr class=\"mainpage\">";
	    $cnt_day++;
	} while($cnt_day <= 24);
	
	eval("\$tpl->output(\"".$tpl->get("advent")."\");");
Dieser Code funktioniert einwandfrei.

Vielen vielen vielen Dank für eure Lösungsansätze. Habe daraus viel lernen können.
 
Zurück