dax4fun
Goto Top

Auswahl in Schleife treffen

Hi, hoffe ihr könnt mir helfen.

ich habe eine Pdf Vorlage (Kostenvoranschlag) die aus min. 3 Seiten besteht, die ich mit posten befüllen soll.

Seite 1 kann 5 posten aufnehmen, Seite 2 kann 7 posten aufnehmen und Seite 3 ist nur die Zusammenfassung aller posten.

Wenn mehr als 12 posten sein sollten wird eine neue Seite 2 eingefügt. Bsp. 13 Posten .... S1 + S2 +S2 + S3.

Seite 1 kann ich mit 5 posten füllen dann kommt die Schleife zu Seite 2 Leer und Seite 3 ist wieder Ok.

nach etlichen versuchen bin ich dann von if und elseif auf switch gekommen (jetzt denk blokade)

Bitte um Hilfe


  $rownrtemp=$rownr;
}

if ($rownr>=5) {
	if ($rownr==$rownrtemp) {                           //Bedingung erfüllt  $rownr=5
		$rownrtemp=$rownrtemp+7;
		$seitennummer=$seitennummer+1;
				 }

	if ($rownr==$rownr+1) {
	     //pdf zeug...tu was
}
	if ($rownr==$rownr+2) {
		//pdf zeug...tu was
}
	if ($rownr==$rownr+3) {
		//pdf zeug...tu was
}
	if ($rownr==$rownr+4) {
	       //pdf zeug...tu was
}
	if ($rownr==$rownr+5) {
	       //pdf zeug...tu was
}
	if ($rownr==$rownr+6) {
	      //pdf zeug...tu was.
}
	if ($rownr==$rownr+7) {
		//pdf zeug...tu was.
	}	
  $rownr++;

 } 
}

Content-ID: 375408

Url: https://administrator.de/contentid/375408

Ausgedruckt am: 18.11.2024 um 07:11 Uhr

erikro
erikro 30.05.2018 aktualisiert um 08:12:44 Uhr
Goto Top
Moin,

was Du da treibst, weiß ich nicht, aber

Zitat von @dax4fun:
> 
>   $rownrtemp=$rownr;
> }

Wo kommt $rownrtemp her? Was steht da drin? Und wo ist die im topic erwähnte Schleife? Ein wenig mehr Code wäre nicht schlecht.


 if ($rownr>=5) {
> 	if ($rownr==$rownrtemp) {                           //Bedingung erfüllt  $rownr=5

Nö, es sei denn in $rownrtemp steht 5.

		$rownrtemp=$rownrtemp+7;
> 		$seitennummer=$seitennummer+1;
> 				 }
> 

Warum?

	if ($rownr==$rownr+1) {
> 	     //pdf zeug...tu was
> }

Diese Bedingung ist niemals wahr. NIEMALS! Denn, wenn jetzt in $rownr eine 5 steht, dann steht da aufgelöst:

if(5==6)

Und das ist nie wahr. Egal, was in $rownr steht. Es kann nie gleich $rownr+1 sein. Das gilt auch für alle folgenden Vergleiche.

Liebe Grüße

Erik
136166
136166 30.05.2018 aktualisiert um 10:42:23 Uhr
Goto Top
Lass das mit den ganzen IF-Vergleichen, das kannst du viel einfacher lösen indem du folgendes machst:
  • Von deiner Gesamtanzahl an Seiten ziehst du 5 ab und ermittelst so ob du Seite 2 brauchst oder nicht
  • Hast du im ersten Ergebnis >5 ermittelt dann teilst du nun dieses Ergebnis durch 7 und nimmst davon das "ceiling" http://php.net/manual/de/function.ceil.php --> ceil(Ergebnis/7)
  • Dieses Ergebnis ist nun die Anzahl wie oft du deine Seite 2 erzeugen musst. Damit fertigst du eine for Schleife an, fertig ist die Pappe.
dax4fun
dax4fun 30.05.2018 aktualisiert um 10:57:54 Uhr
Goto Top
$rownr=1;
$seitennummer=1;
while($row = mysqli_fetch_object($ergebnis)) {
// SEITE 1 #######################################################

if ($rownr<=5) {

    
    if ($rownr==1) {$pdf->SetFont('Arial','',8);  
		$pdf->SetXY(14, 145); und weitere befehle 
		}

    if ($rownr==2) { // und weitere befehle wie bei if($rownr==1)...
		}

    if ($rownr==3) {// und weitere befehle wie bei if($rownr==1)...
		}

    if ($rownr==4) {// und weitere befehle wie bei if($rownr==1)...
		;}

    if ($rownr==5) {// und weitere befehle wie bei if($rownr==1)...
		;}


  $rownr++;
  $rownrtemp=$rownr;

 }
// SEITE 2 #####################################################

if ($rownr>=5) {
	if ($rownr==$rownrtemp) {
		$rownrtemp=$rownrtemp+7;
		$seitennummer=$seitennummer+1;
		
		 }

	if ($rownr==$rownr+1) { // weitere befehle
	
}

	if ($rownr==$rownr+2) {// weitere befehle
		
}

	if ($rownr==$rownr+3) {// weitere befehle
		
}

	if ($rownr==$rownr+4) {// weitere befehle
	
}

	if ($rownr==$rownr+5) {// weitere befehle
		
}
		
	if ($rownr==$rownr+6) {// weitere befehle
		
}

	if ($rownr==$rownr+7) {// weitere befehle
		
	}	
  $rownr++;

 } 
}


Hi Erik, vielleicht ist es ersichtlicher habe eine While schleife und bei jedem durchlauf erhöhe ich den Wert von $rownr. $rownrtemp ist eigentlich der Bereich für Posten, auf Seite 2 wäre das 5 bis 12 und wenn $rownr= 12 und $rownrtemp=12 füge neue Seite hinzu und erweitere $rownrtemp +7 also dann 12 bis 19. deswegen auch if(5==6) irgendwann sollte es ja passen und es wird $rownr= $rownrtemp
Pedant
Pedant 30.05.2018 um 11:09:52 Uhr
Goto Top
Hallo dax4fun,

Zitat von @dax4fun:
nach etlichen versuchen bin ich dann von if und elseif auf switch gekommen (jetzt denk blokade)
warum verwendest Du dann switch nicht oder hast Du uns veralteten Code gepostet?
decathlons Ansatz erscheint mir aber auch deutlich sinniger als Deiner.

Wenn ich Deiner Aufforderung nachkomme, jetzt "blokade" zu denken, denke ich Du meintest Denkblockade und halte drei Fehler in einem Wort für etwas zu üppig.

@136166
Zitat von @136166:
Hast du im ersten Ergebnis >5 ermittelt dann teilst du nun dieses Ergebnis durch 7 und nimmst davon das "ceiling"
Vor dem Teilen durch 7 müssen aber zunächst die 5 (der ersten Seite) abgezogen werden.

Gruß Frank
136166
136166 30.05.2018 aktualisiert um 11:20:47 Uhr
Goto Top
Zitat von @Pedant:
Vor dem Teilen durch 7 müssen aber zunächst die 5 (der ersten Seite) abgezogen werden.
Jepp
Pedant
Pedant 30.05.2018 um 11:19:21 Uhr
Goto Top
Hallo dax4fun,

Zitat von @dax4fun:
if ($rownr==$rownr+7) {// weitere befehle
Wie Erik schon schrieb:

Wie soll denn jemals 5 == 6 wahr werden?

Nur $rownr == $rownr + 0 wäre (immer) wahr.
Alle anderen Varianten ( + 1 oder mehr) sind niemals wahr, egal wie lange irgendeine Schleife durchlaufen wird.

Gruß Frank
SlainteMhath
SlainteMhath 30.05.2018 um 11:33:33 Uhr
Goto Top
Moin,

@136166 's Lösung ist genau richtig. So und nicht anders würde ich das auch machen.

lg,
Slainte
dax4fun
dax4fun 30.05.2018 um 11:33:43 Uhr
Goto Top
Hi Decathlon,

ich soll die Gesamtzahl an Posten definieren Bsp. 13 => Seite1, -5 Posten =>FOR Seite2, -7 Posten => Seite2, -1 Posten wenn 0 /FOR


wenn das gut geht

Danke erst mal
136166
Lösung 136166 30.05.2018 aktualisiert um 12:11:17 Uhr
Goto Top
Beispiel schnell zusammengeschrotet:
$intPages = 22;
$itemsOnPage1 = 5;
$itemsOnPage2 = 7;

if ($intPages > $itemsOnPage1){
	$full = floor(($intPages - $itemsOnPage1) / $itemsOnPage2) + 1;
	$rest = ($intPages - $itemsOnPage1) % $itemsOnPage2;
	echo "Items on Page 1<br />";  
	for ($i = 0; $i < $itemsOnPage1; $i++){
		echo "item $i<br />";  
	}
	for ($p = 0; $p < $full;$p++){
		if ($p < $full-1){
			echo "Items on Pagetemplate 2 ($p)<br />";  
			for ($i = ($p * $itemsOnPage2 + $itemsOnPage1); $i < ($p * $itemsOnPage2) + $itemsOnPage2 + $itemsOnPage1; $i++){
				echo "Item $i<br />";  
			}
		}else{
			if ($rest > 0 ){
				echo "Items on Pagetemplate 2 ($p)<br />";  
				for ($i = ($p * $itemsOnPage2 + $itemsOnPage1); $i < ($p * $itemsOnPage2) + $itemsOnPage1 + $rest; $i++){
					echo "Item $i<br />";  
				}			
			}
		}
	}
}else{
	if ($intPages > 0){
		echo "Items on Page 1<br />";  
		for ($i = 0; $i < $intPages; $i++){
			echo "item $i<br />";  
		}
	}
}
erikro
Lösung erikro 30.05.2018 um 11:48:40 Uhr
Goto Top
Moin,

nochmal, da steht:

if ($rownr==$rownr+1)

Das ist NIE wahr. Wenn $rownr den Inhalt 5 hat, dann lautet der Vergleich

if(5 == 5+1)

Genauso bei 6

if(6 == 6+1)

usw.

Ich vermute mal, dass eins von beiden $rownrtemp sein soll.

Liebe Grüße

Erik
Pedant
Pedant 30.05.2018 um 12:01:42 Uhr
Goto Top
Hallo decathlon,

Dein Code funktioniert bei mir.
Zwischen Zeile 3 und 4 sollte noch ein Block eingefügt werden, damit auch eine Ausgabe erfolgt, falls keine Seite 2 benötigt wird.
if ($intPages <= $itemsOnPage1){
	echo "Items on Page 1<br />";  
	for ($i = 0; $i < $itemsOnPage1; $i++){
		echo "item $i<br />";  
	}
}

$intPages würde ich lieber $itemsTotal oder so nennen, da es sich nicht um die Seitenanzahl handelt, sondern um die Gesamtmenge der Items (Posten), die es auf die Seiten zu verteilen gilt.

Gruß Frank
dax4fun
dax4fun 30.05.2018 um 12:06:56 Uhr
Goto Top
Danke Erik ist mir erst jetzt klar habe zwar absichtlich rownr genommen in dem Gedanken rownr hat eine fixe zahl dabei ändert sie sich ja mit dem erhöhen, und ich dachte mir die ganze Zeit das +1 bei $rownr+1 geht nicht.
Ohh Mann, Danke auch beim ersten Posting von dir merkte ich es nicht Wahnsinn.
erikro
Lösung erikro 30.05.2018 um 12:10:53 Uhr
Goto Top
Moin,

sowas passiert. ;)

Liebe Grüße

Erik
Pedant
Pedant 30.05.2018 aktualisiert um 14:12:14 Uhr
Goto Top
Hallo dax4fun,

Zitat von @dax4fun:
...dabei ändert sie sich ja mit dem erhöhen
ja und wenn sie mit dem Wert 4 durchlaufen wird, wird sie zweimal erhöht.
Siehe Dein Code mit meinem // Kommentar:
$rownr=1;
while($row = mysqli_fetch_object($ergebnis)) {
	...
	if ($rownr<=5) { // 4 <= 5 => wahr
		...
		$rownr++; // 4++ => 5
	}
	if ($rownr>=5) { // 5 >= 5 => wahr
		...
		$rownr++; // 5++ => 6
	}
}

Falls Du bei Deinem Ansatz bleiben möchtest, statt decathlons funktionierenden Code zu verwenden...

Die Erhöhung solltest besser nur einmal und zwar ans Schleifenblock-Ende setzen.

Zusätzlich würde ich nicht $rownr<=5 und $rownr>=5 verwenden, sondern
$rownr<=5 und $rownr>5, damit entweder der erste Block oder der zweite Block ausgeführt wird.
So hast Du eine nachvollziehbarere Entweder-oder-Unterscheidung und kannst Deine Anweisungen besser zuteilen und damit Fehler vermeiden.
$rownr=1;
while($row = mysqli_fetch_object($ergebnis)) {
	...
	if ($rownr<=5) { // 4 <= 5 => wahr
		...
	}
	if ($rownr>5) { // 4 > 5 => falsch
		...
	}
	$rownr++; // 4++ => 5
}

Gruß Frank
dax4fun
dax4fun 30.05.2018 um 17:15:04 Uhr
Goto Top
Danke habe es gelöst durch die Aufmerksamkeit von eriko und SlainteMhath ;)
habe eine weitere variable mitgeführt welche die Posten mitzählt und diese mit der Gesamtpostenanzahl vergleicht und wenn erfüllt einen break; ausführt.


if ($postennr==$rownrtemp-6) {

if ($postennr==$postenanzahl) {break;}
$postennr++;
}

Vielen Dank an alle beteiligten