PHP logisches Problem beim Rechnen

Zap

Ensign
Registriert
Nov. 2008
Beiträge
130
Guten Tag,

ich bin gerade dabei eine Clankasse zu basteln, vom Grund her funktioniert sie bereits mit dem normalen AdminBeitrag. Jetzt haben wir aber noch einen kleinen Admin und einen SuperBeitrag und ich weiß nicht, wie ich die Gesamtsumme errechnen kann(komme einfach nicht drauf) wie ich es am besten mache!
PHP:
<?php




// HIER DIE KOSTEN im Monat EINTRAGEN ------------------

$kleinerAdminBeitrag = 5;
$AdminBeitrag = 10;
$SuperBeitrag = 20;
$Serverkosten = 200;

// ---------------------------------------------

print "<center><table>
<br>
<center><img src=\"images/style_red/clankasse_banner11.png\"></center><br>



<tr><td background=\"images/style_red/rechteckname.png\" width=\"161\"><right>Name</right></td>\n
<td background=\"images/style_red/rechteckmonat.png\" width=\"40\"><center>Jan</center></td><td background=\"images/style_red/rechteckmonat.png\" width=\"40\"><center>Feb</center></td><td background=\"images/style_red/rechteckmonat.png\" width=\"40\"><center>Mar</center></td><td background=\"images/style_red/rechteckmonat.png\" width=\"40\"><center>Apr</center></td>
<td background=\"images/style_red/rechteckmonat.png\" width=\"40\"><center>Mai</center></td><td background=\"images/style_red/rechteckmonat.png\" width=\"40\"><center>Jun</center></td><td background=\"images/style_red/rechteckmonat.png\" width=\"40\"><center> Jul </center></td><td background=\"images/style_red/rechteckmonat.png\" width=\"40\"><center>Aug</center></td>
<td background=\"images/style_red/rechteckmonat.png\" width=\"40\"><center>Sep</center></td><td background=\"images/style_red/rechteckmonat.png\" width=\"40\"><center>Okt</center></td><td background=\"images/style_red/rechteckmonat.png\" width=\"40\"><center>Nov</center></td><td background=\"images/style_red/rechteckmonat.png\" width=\"40\"><center>Dez</center></td></tr>";
$datei=fopen("clankassen/bezahler/bezahler.txt",r);
$Dateiinhalt=fread($datei,10000);
fclose ($datei);
$Bezahler=explode(",",$Dateiinhalt);
$anzahlZeilen=count($Bezahler)/13;
$farbe="#808080";
for ($i=0;$i<=$anzahlZeilen-1;$i++)
{
          print "<tr>";
          if ($farbe=="#C0C0C0") $farbe="#C0C0C0";
          else $farbe="#C0C0C0";

          for ($j=0;$j<=12;$j++)
          {
              $position=$i*13+$j;
              if ($j==0) print"<td background=\"images/style_red/nicks.png\"><right>$Bezahler[$position]</right></td>";
              if ($j>0)
              {

                  switch ($Bezahler[$position])
                  {

                      case 0: print"<td background=\"images/style_red/rechteck.png\"><center><img src=\"images/blank.png\"></center></td>";break;
                      case 1: print"<td background=\"images/style_red/rechteck.png\"><center><img src=\"images/bezahlt.png\"></center></td>";break;
                      case 2: print"<td background=\"images/style_red/rechteck.png\"><center><img src=\"images/nicht_bezahlt.png\"></center></td>";break;
                      case 3: print"<td background=\"images/style_red/rechteck.png\"><center><img src=\"images/kreuts.png\"></center></td>";break;
                      case 4: print"<td background=\"images/style_red/rechteck.png\"><center><img src=\"images/keinmitglied.png\"></center></td>";break;
                      case 5: print"<td background=\"images/style_red/rechteck.png\"><center><img src=\"images/inaktiv.png\"></center></td>";break;#
                      default: print"<td background=\"images/style_red/rechteck.png\"></td>";break;
                  }
              }
          }
          print"</tr>";

      }
      print"<tr><td background=\"images/style_red/rechteckname.png\">Gesamt<br> Euro</a></td>";
      for ($j=1;$j<=12;$j++)
      {
          $summe=0;
          for ($i=0;$i<=$anzahlZeilen-1;$i++)
          {
              $position=$i*13+$j;
              if ($Bezahler[$position]==1) $summe=$summe+$Bezahler[$position];
          }
        $summe=$summe*$AdminBeitrag;

          if ($summe < $Serverkosten) print"<td background=\"images/style_red/rechteckmonat.png\"><center><font color=\"red\">$summe Euro</font></center></td>";
             else print"<td background=\"images/style_red/rechteckmonat.png\"><center><font color=\"green\">$summe Euro</font></center></td>";
      }
      print"<tr><td bgcolor=\"Black\" colspan=\"13\">

<center><img src=\"images/style_red/info.png\"><br>


</table></center>";
?>

ich hoffe man versteht was ich meine.

vielleicht kann mir jemand helfen, wäre super!
 
Hmm... vielleicht liegts daran, daß es schon halb fünf ist, aber ich kann aus deinem Stück Code einfach nicht herauslesen, was du eigentlich machen willst...

Ein paar mehr Infos wären nicht verkehrt. Den Quelltext hinwerfen, ohne weitere Infos und Kommentare ist selten ein guter Ansatz für Hilfegesuche! Vor allem bei so schönen verschachtelten Schleifen sind ein paar Worte der Erklärung immer gut. Erleichtert den Durchblick und man muß nicht erst mit Zettel und Papier versuchen, die implementierte Logik deines Programms rückwärts zu entwickeln :P

Was steht in welcher Form in dieser ominösen "bezahler.txt" wäre eine Information, die vielleicht ein wenig Licht ins Dunkel bringt.

Und was hat es mit
Code:
$kleinerAdminBeitrag = 5;
$AdminBeitrag = 10;
$SuperBeitrag = 20;
$Serverkosten = 200;
aufsich!?

Ein paar mehr Infos und dann findet sich vielleicht auch jemand der Willens und Fähig ist, dir zu helfen :)
 
Kann mich KillerCrow nur anschließen ... und ein allgemeiner Tipp. Schleifenvariablen in der Schleife für die nächste Schleife nutzen is kein guter Stil (schon ein Satz mit sovielen Schleifen is kein guter Stil :D)

Besonders deine Berechnung is mir ein Rätsel.

Für mich liest es sich so ...

Ihr braucht 200€ für den Server, für jeden Benutzer is in der TXT irgendeine Zahl abgelegt aber scheinbar kein Beitrag. So das man 10 Zahler plus den alles verzehnfachenden Admin braucht um den Server zu finanzieren, es geht aber auch mit 4 Nichtmitgliedern und dem Admin ???

Ganz schön verwirrend
 
Zuletzt bearbeitet:
Über den Stil müßte man (leider) eh mal reden, aber jeder fängt klein an. Erstmal ein Problem lösen und dann gehts weiter :evillol:
 
ok, ich versuch es mal genauer zu erklären! dachte eigentlich es ist relativ leicht zu verstehen, sorry!!!!!

also wir haben verschiedene Mitglieder, die verschieden viel zahlen.(siehe nächsten Code)

Code:
$kleinerAdminBeitrag = 5;
$AdminBeitrag = 10;
$SuperBeitrag = 20;
$Serverkosten = 200;

ich lese eine Datei aus, wo drin steht wer wieviel bezahlt
Inhalt Datei:
eve_ ,,,,,,,,,,,,,
Bloodfinger ,1,5,4,3,2,2,2,2,2,2,2,2,



/*
AdminBeitrag 1
kein Beitrag 2
Zahlpause 3
kleiner Admin 4
SuperBeitrag 5
nichts eingetragen ist leeres Feld
*/


Code:
$datei=fopen("clankassen/bezahler/bezahler.txt",r);
$Dateiinhalt=fread($datei,10000);
fclose ($datei);
$Bezahler=explode(",",$Dateiinhalt);
$anzahlZeilen=count($Bezahler)/13;
$farbe="#808080";
for ($i=0;$i<=$anzahlZeilen-1;$i++)
{
print "<tr>";
if ($farbe=="#C0C0C0") $farbe="#C0C0C0";
else $farbe="#C0C0C0";
 
for ($j=0;$j<=12;$j++)
{
$position=$i*13+$j;
if ($j==0) print"<td background=\"images/style_red/nicks.png\"><right>$Bezahler[$position]</right></td>";
if ($j>0)
{
 
switch ($Bezahler[$position])
{
 
case 0: print"<td background=\"images/style_red/rechteck.png\"><center><img src=\"images/blank.png\"></center></td>";break;
case 1: print"<td background=\"images/style_red/rechteck.png\"><center><img src=\"images/bezahlt.png\"></center></td>";break;
case 2: print"<td background=\"images/style_red/rechteck.png\"><center><img src=\"images/nicht_bezahlt.png\"></center></td>";break;
case 3: print"<td background=\"images/style_red/rechteck.png\"><center><img src=\"images/kreuts.png\"></center></td>";break;
case 4: print"<td background=\"images/style_red/rechteck.png\"><center><img src=\"images/keinmitglied.png\"></center></td>";break;
case 5: print"<td background=\"images/style_red/rechteck.png\"><center><img src=\"images/inaktiv.png\"></center></td>";break;#
default: print"<td background=\"images/style_red/rechteck.png\"></td>";break;
}
}
}

jetzt lasse ich die gesamten Einnahmen(bisher nur $AdminBeitrag) addieren und stell diese gegen die Serverkosten:
Code:
print"<tr><td background=\"images/style_red/rechteckname.png\">Gesamt<br> Euro</a></td>";
for ($j=1;$j<=12;$j++)
{
$summe=0;
for ($i=0;$i<=$anzahlZeilen-1;$i++)
{
$position=$i*13+$j;
if ($Bezahler[$position]==1) $summe=$summe+$Bezahler[$position];
}
$summe=$summe*$AdminBeitrag;
 
if ($summe < $Serverkosten) print"<td background=\"images/style_red/rechteckmonat.png\"><center><font color=\"red\">$summe Euro</font></center></td>";
else print"<td background=\"images/style_red/rechteckmonat.png\"><center><font color=\"green\">$summe Euro</font></center></td>";
}
print"<tr><td bgcolor=\"Black\" colspan=\"13\">

soweit so gut, jetzt möchte ich noch den $KleinerAdminBeitrag und $SuperBeitrag mit zu rechnen und da verlassen Sie mich!



hoffe ist jetzt verständlicher
 
Ich fang jetzt nicht an, sonderlich was zu verbessern, sondern bastel einfach was in deinen quelltext rein. In dem Stück hier:

Code:
for ($i=0;$i<=$anzahlZeilen-1;$i++)
{
$position=$i*13+$j;
if ($Bezahler[$position]==1) $summe=$summe+$Bezahler[$position];
}
$summe=$summe*$AdminBeitrag;

Brauchst du theoretisch nur den "if" Teil mit dem "case" aus dem oberen Stück zu ersetzen und ein bisschen anzupassen, was dann so aussehen könnte:

Code:
for ($i=0;$i<=$anzahlZeilen-1;$i++)
{
$position=$i*13+$j;
switch ($Bezahler[$position])
{
case 1: summe += $AdminBeitrag; break;
case 2: break; // kein Beitrag, also keine Veränderung von $summe
case 3: break; // Zahlpause, also keine Veränderung von $summe
case 4: summe += $kleinerAdminBeitrag; break;
case 5: summe += $SuperBeitrag; break;
default: break; // irgendwas anderes, also keine Veränderung von $summe
}

Die Berechnung von "$summe" nach der "for" Schleife brauchst du dann nicht mehr, weil "$summe" direkt aufaddiert wird. Du hast dir ja vorher gemerkt, wie oft ein AdminBetrag vorkam und hast das dann am Ende mit AdminBetrag multipliziert. Geht auch, aber warum nicht einfach gleich aufaddieren ;)

Eventuell ist da noch was krum, bin schon recht müde und hab keinen Kopf mehr für sowas ^^.

Hoffe das Hilft ein bisschen.
Ergänzung ()

... noch ein kleiner Nachtrag. Das Aufaddieren kannst du auch beim ersten Durchlaufen der Datensätze erledigen und die jeweiligen Monatsergebnisse in einem Array ablegen. Auf diese Weise brauchst du nicht zweimal diese verschachtelte Schleife durchackern. Aber solche Ideen kommen von ganz alleine, wenn man ein bisschen mehr Erfahrung gesammelt hat.

Viel Spaß dir jedenfalls noch mit der Programmierung :)
 
schon mal danke für die hilfe, ich verstehe es vom prinzip was du mir da sagen willst, doch noch steige ich nicht ganz durch. wie bereits erkannt bin ich relativ neu auf dem gebiet. noch klappt es leider nicht. aber ich wurstel mich weiter durch.
 
So, hatte Langeweile und hab ein bisschen gebastelt. Ist absolut und definitiv kein Vorzeigeskript, aber soweit ich das jetzt probiert habe, funktioniert es. Auf Fehlerbehandlung etc. hatte ich keine Lust, ist also wirklich alles nur quick and dirty *duck*

Ich werd zusehen, hier noch ein paar mal reinzuschauen, aber versprechen kann ich es nicht. Wenn also Fragen sind, dann müssen ggf. die anderen helfen, sorry :/

Viel Spaß dir aber weiterhin mit PHP und Co. :D

PHP:
<?php

/**
 * Ein paar Konstanten für die möglichen Einträge in der Datei festlegen.
 * So ist man unabhängig von den konkreten Werten...
 */
define( 'FEE_ADMIN_SMALL',  4 );
define( 'FEE_ADMIN_NORMAL', 1 );
define( 'FEE_SUPER',        5 );
define( 'FEE_NOT_PAYED',    2 );
define( 'FEE_PAUSED',       3 );

//Speichert die aufaddierten Summen für jeden Monat
$contributions = array( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );

//Hier die Beträge für die einzelnen Varianten eintragen
$serverkosten = 200;
$fees = array(
	FEE_ADMIN_SMALL  =>  5, // Kleiner Admin Beitrag
	FEE_ADMIN_NORMAL => 10, // Admin Beitrag
	FEE_SUPER        => 20, // Super Beitrag
	FEE_NOT_PAYED    =>  0, // Nicht gezahlt
	FEE_PAUSED       =>  0  // Pause
);
//---------------------------------------------

print( '<center><table><br><center><img src="images/style_red/clankasse_banner11.png"></center><br>'
      .'<tr><td background="images/style_red/rechteckname.png" width="161"><right>Name</right></td>'
      .'<td background="images/style_red/rechteckmonat.png" width="40"><center>Jan</center></td><td background="images/style_red/rechteckmonat.png" width="40"><center>Feb</center></td><td background="images/style_red/rechteckmonat.png" width="40"><center>Mar</center></td><td background="images/style_red/rechteckmonat.png" width="40"><center>Apr</center></td>'
      .'<td background="images/style_red/rechteckmonat.png" width="40"><center>Mai</center></td><td background="images/style_red/rechteckmonat.png" width="40"><center>Jun</center></td><td background="images/style_red/rechteckmonat.png" width="40"><center> Jul </center></td><td background="images/style_red/rechteckmonat.png" width="40"><center>Aug</center></td>'
      .'<td background="images/style_red/rechteckmonat.png" width="40"><center>Sep</center></td><td background="images/style_red/rechteckmonat.png" width="40"><center>Okt</center></td><td background="images/style_red/rechteckmonat.png" width="40"><center>Nov</center></td><td background="images/style_red/rechteckmonat.png" width="40"><center>Dez</center></td></tr>' );

/*****
 * Datei zeilenweise in das array $csv einlesen.
 * Zeilenumbrüche und leere Zeilen werden entfernt
 */
//$csv = file( "clankassen/bezahler/bezahler.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
$csv = file( "contributors.csv", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );

if ( $csv === false )
{
    die( 'Could not open/read inputfile... dying a horrible death *aaaarrrrgh*'."\n" );
}

$farbe="#808080";

/***
 * Alle aus der Datei gelesenen Zeilen abarbeiten
 */
for ( $i = 0; $i < count( $csv ); ++$i )
{
	//aktuelle Zeile an ',' zerlegen
	$lines[$i] = explode( ',', $csv[$i] );

	print "<tr>";

	//Das folgende if ist irgendwie sinnlos...	
	//if ($farbe=="#C0C0C0") $farbe="#C0C0C0";
	//else $farbe="#C0C0C0";
	$farbe="#C0C0C0";

	/***
	 * zerlegte Zeile durcharbeiten
	 */
	for ( $j = 0; $j < 13; ++$j )
	{
		//$position brauchen wir nicht mehr, wir gehen zeilenweise durch
		//$position=$i*13+$j;

		//Beim jeweils ersten Element einer Zeile haben wir den Namen
		if ( $j == 0 )
		{
			print( '<td background="images/style_red/nicks.png"><right>'. $lines[$i][0] .'</right></td>' );
		}
		//Alle anderen Elemente beschreiben die Art der Zahlung für den Monat 
		else
		{
			print( '<td background="images/style_red/rechteck.png">' );
				
			//Beiträge in $contributions aufaddieren, falls in dem Monat gezahlt wurde
			switch ( $lines[$i][$j] )
			{
				case 0: //keine Ahnung warum das drin war, ich habs gelassen
					print( '<center><img src="images/blank.png"></center></td>' );
				break;

				case FEE_ADMIN_NORMAL:
					$contributions[$j-1] += $fees[FEE_ADMIN_NORMAL];
					print( '<center><img src="images/bezahlt.png"></center></td>' );
				break;

				case FEE_NOT_PAYED:
					print( '<center><img src="images/nicht_bezahlt.png"></center></td>' );
				break;

				case FEE_PAUSED:
					print( '<center><img src="images/kreuts.png"></center></td>' );
				break;

				case FEE_ADMIN_SMALL:
					$contributions[$j-1] += $fees[FEE_ADMIN_SMALL];
					print( '<center><img src="images/keinmitglied.png"></center></td>' );
				break;

				case FEE_SUPER:
					$contributions[$j-1] += $fees[FEE_SUPER];
					print( '<center><img src="images/inaktiv.png"></center></td>' );
				break;

				default:
				break;
			}
		}
	}
	print( '</tr>' );
}

print( '<tr><td background="images/style_red/rechteckname.png">Gesamt<br> Euro</a></td>' );

//Und jetzt nochmal die aufaddierten Summen durchgehen und ausgeben
for ( $i = 0; $i < 12; ++$i  )
{
    $color = ( $contributions[$i] < $serverkosten ) ? 'red' : 'green';
	print( '<td background="images/style_red/rechteckmonat.png"><center><font color="'. $color .'">'. $contributions[$i] .' Euro</font></center></td>' );
}
print( '</tr><tr><td bgcolor="Black" colspan="13"><center><img src="images/style_red/info.png"><br></table></center>' );

?>
 
Zuletzt bearbeitet:
Was für eine Klasse!? Wir sind hier nicht in Java oder c# oder so... in PHP braucht man nicht zwingend Klassen. Der gute alte prozedurale Ansatz funktioniert hier auch noch :P

Ich hab einfach nur das ursprüngliche Skript ein bisschen umgearbeitet... quick and dirty, wie gesagt.

file_get_contents() liefert den Inhalt der Datei als String zurück. Den hätte ich für meinen Ansatz dann an den Zeilenumbrüchen mit strtok() oder explode() oder so erst weiter zerlegen müssen, was file() für mich gleich mit erledigt. Letzteres liefert ja den Inhalt zeilenweise als Array zurück.

Wie gesagt, geht auf jeden Fall schöner und eleganter, ich hatte nur mal wieder Lust auf PHP ;)
 
hey Killer, schön dass ich dir wieder mal Lust auf PHP gemacht hatte! Und das ich daraus noch meinen Nutzen ziehe, ist ja auch nicht schlecht ;-)
Ich sage vielen lieben Dank, genauso funktioniert es jetzt!!! *ich freu mich sehr*

Muss mir es nochmal genau anschauen, was da dreckig ist, weil so tief bin ich wohl noch nicht drin in PHP, aber das wird schon. Und aus solchen Sachen kann man nur lernen.

Habe dir ne PN geschickt, wo man die Kasse sehen kann.

Big THX
 
Zurück
Oben