Antworten auf deine Fragen:
Neues Thema erstellen

40+ if bedingungen Abkürzen

rey

Der Frager ;)

Hi,
ich habe eine Optimierung eines Ranking Systems vor, der Titel sagt auch weshalb.
Es gibt verschiedene Rankings.
D-,D,D+,C-...A+
Anahnd von Punkten wird ermittelt um welchen Rank es sich handelt.
Da ich aber der Meinung bin das es alles andere als guter Quellcode ist wenn man bei den Verschiedenen fällen eine IF bzw. elseif macht wollte ich Fragen wie man das Optimieren könnte.
PHP:
if(p1=="D-" && p2=="D-")
{
...
}
elseif(p1=="D-" && p2=="D")
{
..
}
...
...
...
elseif(p1=="D-" && p2=="A+")
{
..
}
...
...
...
elseif(p1=="A+" && p2=="A")
{
...
}else
{
...
}
so schaut es bisher aus was wie gesagt alles andere als gut ist.
Ich denke bei Case wäre es auch nicht anders da habe ich halt dan Case 1:.. BReak; etc.
 
Zuletzt bearbeitet:

ChrisvA

Aktives Mitglied

AW: 40+ if bedingungen Abkürzen

Ein wenig Optimierung währe vielleicht schon das:
PHP:
if(p1=="D-") 
{ 
if(p2=="D-"){
...
}
elseif(p2=="D"){
...}
elseif(p2=="A+"){
...
}
} elseif(p1=="A+") 
{ 
... 
if(p2=="A"){
...
}
}else 
{ 
... 
}

Was vielleicht auch möglich währe, das ganze über Funktionen zu regeln.
Also eine Funktion D_minus_A_plus()
Dann wandelst du deine Werte jeweils in einen String um und nimmst dann call_user_func();
PHP: call_user_func - Manual
Hat aber das Sicherheitsrisiko, dass man dir vielleicht PHP-Code injuzieren kann, wenn du nicht aufpasst.
 

tgreve

********

AW: 40+ if bedingungen Abkürzen

Moin!

Zunächst ist es erstmal interessent zu wissen, welche Bedingungen es denn jeweils geben kann?
 

tgreve

********

AW: 40+ if bedingungen Abkürzen

achja: tu dir selber (und auch anderen ) den Gefallen deine Anweisungen ein wenig zu gliedern.
Also so:


if(p1=="D-")
{
if(
p2=="D-")
{
...
}
elseif(
p2=="D")
{
...
}
elseif(
p2=="A+")
{
...
}
}
elseif(
p1=="A+")
{
...
if(
p2=="A")
{
...
}
}
else
{
...
}


...So schaut es doch schon ein wenig übersichtlicher aus, oder? ;)
 

tgreve

********

AW: 40+ if bedingungen Abkürzen

Na toll!
Leerzeichen vor den "{" werden also beim abspeichern hier im Forum rausgefiltert!
Also lassen wir das mit dem aufräumen... :D
 

rey

Der Frager ;)

AW: 40+ if bedingungen Abkürzen

Moin!

Zunächst ist es erstmal Interessent zu wissen, welche Bedingungen es denn jeweils geben kann?

deshalb habe ich es doch so geschrieben wie oben im Prinzip geht man jeden rank durch den es gibt.
D- -> A+
Das selbe Spiel für D -> A+
etc...

Meins ist doch gegliedert...
 

sokie

Mod | Web

AW: 40+ if bedingungen Abkürzen

du könntest nach dem Beispielcode zb Fälle zusammenfassen, wenn das Sinn macht:
Code:
if (p1 == "D-"){
  if (p2 == "D-"){
    //anweisung
  }
 if (p2 == "D"){
    //anweisung
  }
 if (p2 == "A+"){
    //anweisung
  }
} else {
...
}


mich wundert eigentlich, dass, wo es schon um ranking geht, der Rang nicht durch einfache numerische Werte dargestellt wird, die man per "grösser/kleiner" vergleichen könnte..
 
Zuletzt bearbeitet:

rey

Der Frager ;)

AW: 40+ if bedingungen Abkürzen

hm wäre eine Idee es nummerisch zu machen, aber die Fälle zusammenfassen würde die Anzahl der IF nicht kürzen.
 

Duddle

Posting-Frequenz: 14µHz

AW: 40+ if bedingungen Abkürzen

Könntest du bitte aus den Rümpfen ein paar Beispiele zeigen? Wird dort abhängig von den beiden Rängen nur eine dritte Variable gesetzt?


Duddle
 

tgreve

********

AW: 40+ if bedingungen Abkürzen

Also du willst wissen, ob in p2 "D+,D,D-,C+,C,C-,B+,B,B-,A+,A" oder "A-" steht in abhängigkeit von p1?

Frage eben war was es für Fälle geben kann.
Ich gehe jetzt mal von A bis D jeweils +, -, oder neutral aus, richtig?
 

rey

Der Frager ;)

AW: 40+ if bedingungen Abkürzen

Hier ein Genaueres Beispiel:
PHP:
elseif($p1== "A" && $p2== "D-") {  
$sql = mysql_query("SELECT * FROM ranking WHERE username='$p1'")or die(mysql_error());
while ($ds = mysql_fetch_object($sql)) 
{
  $punkte = $ds ->punkte;
  $wins = $ds ->wins;
}

$punktew = $punkte+(10*$MOTWADD); 
$sneu=$wins +1;
$query = "UPDATE ranking SET punkte=$punktew, wins=$sneu WHERE username='$p1'";
mysql_query($query);

$sql2 = mysql_query("SELECT * FROM ranking WHERE username='$p2'")or die(mysql_error());
while ($ds = mysql_fetch_object($sql2)) 
{ 
    $punkte = $ds ->punkte;
    $lose = $ds ->lose;
}
$punktel = $punkte-0;   
$nneu=$lose +1;	
$query2 = "UPDATE ranking SET punkte=$punktel, lose=$nneu WHERE username='$p2'";
mysql_query($query2);
}
 

Duddle

Posting-Frequenz: 14µHz

AW: 40+ if bedingungen Abkürzen

...

Ein bisschen mehr wäre nett gewesen, damit man die Logik besser versteht.

Wird für P1 immer wins aktualisiert? Oder nur, weil sein Rang besser ist?
In welcher Abhängigkeit vom Rang wird punktew, punktel berechnet?
etc.

Ich vermute, du hast da einiges an copy&paste-Code drin, den man abstrahieren könnte. Zumindest wenn du etwas mehr verraten würdest.

Edit: welchen Sinn hat es, dass Usernamen in der Ranking-Tabelle wie die Ränge selber heißen? Das verwirrt mich irgendwie :)


Duddle
 
Zuletzt bearbeitet:

rey

Der Frager ;)

AW: 40+ if bedingungen Abkürzen

Hier
PHP:
$sql = mysql_query("SELECT * FROM ranking WHERE username='$p1'")or die(mysql_error());
  while ($ds = mysql_fetch_object($sql))
{

  $punkte = $ds ->punkte;

}

$sql2 = mysql_query("SELECT punkte FROM ranking WHERE username='$p2'")or die(mysql_error());
  while ($ds = mysql_fetch_object($sql2))
{

  $punktel = $ds ->punkte;

}




$MOTWADD = 1.8;

if($punkte >= 0 && $punkte < 500) {
 $ranksieger = "D-"; }
 if($punkte < 0 && $punkte < 500) {
 $ranksieger = "D-"; }
elseif($punkte >= 500 && $punkte < 2000) {
 $ranksieger = "D"; }
elseif($punkte >= 2000 && $punkte < 3000) {
 $ranksieger = "D+"; }
elseif($punkte >= 3000 && $punkte < 4000) {
 $ranksieger = "C-"; }
elseif($punkte >= 4000 && $punkte < 5000) {
 $ranksieger = "C"; }
elseif($punkte >= 5000 && $punkte < 6000) {
 $ranksieger = "C+"; }
elseif($punkte >= 6000 && $punkte < 7000) {
 $ranksieger = "B-"; }
elseif($punkte >= 7000 && $punkte < 8000) {
 $ranksieger = "B"; }
elseif($punkte >= 8000 && $punkte < 9000) {
 $ranksieger = "B+"; }
elseif($punkte >= 9000 && $punkte < 10500) {
 $ranksieger = "A-"; }
elseif($punkte >= 10500 && $punkte < 12000) {
 $ranksieger = "A"; }
elseif($punkte >= 12000 && $punkte < 20000) {
 $ranksieger = "A+"; }
 if($punktel >= 0 && $punktel < 500) {
 $rankverlierer = "D-"; }
  if($punktel < 0 && $punktel < 500) {
 $rankverlierer = "D-"; }
elseif($punktel >= 500 && $punktel < 2000) {
 $rankverlierer = "D"; }
elseif($punktel >= 2000 && $punktel < 3000) {
 $rankname = "D+"; }
elseif($punkte >= 3000 && $punktel < 4000) {
 $rankverlierer = "C-"; }
elseif($punktel >= 4000 && $punktel < 5000) {
 $rankverlierer = "C"; }
elseif($punktel >= 5000 && $punktel < 6000) {
 $rankverlierer = "C+"; }
elseif($punktel >= 6000 && $punktel < 7000) {
 $rankverlierer = "B-"; }
elseif($punktel >= 7000 && $punktel < 8000) {
 $rankverlierer = "B"; }
elseif($punktel >= 8000 && $punktel < 9000) {
 $rankverlierer = "B+"; }
elseif($punktel >= 9000 && $punktel < 10500) {
 $rankverlierer = "A-"; }
elseif($punktel >= 10500 && $punktel < 12000) {
 $rankverlierer = "A"; }
elseif($punktel >= 12000 && $punktel < 20000) {
 $rankverlierer = "A+"; }
Nein wins wird bei p1 aktualisiert weil er der Gewinner ist.
Es werden aber auch die Punkte aktualisiert.
Bei p2 das selbe bei Ihm werden die Niederlagen aktualisiert und die Punkte

Ich habe die tabelle Ranking gennant man kann Sie auch user nennen..
In dieser stehen die Benutzername,Punkte,Siege und Niederlagen
 

sokie

Mod | Web

AW: 40+ if bedingungen Abkürzen

ein kleines Logik Problem:
Code:
[COLOR=#007700]if([/COLOR][COLOR=#0000BB]$punktel [/COLOR][COLOR=#007700]< [/COLOR][COLOR=#0000BB]0 [/COLOR][COLOR=#007700]&& [/COLOR][COLOR=#0000BB]$punktel [/COLOR][COLOR=#007700]< [/COLOR][COLOR=#0000BB]500[/COLOR][COLOR=#007700]) {[/COLOR]
was kleiner 0 ist, ist auch immer kleiner 500
 

Duddle

Posting-Frequenz: 14µHz

AW: 40+ if bedingungen Abkürzen

Den Ablauf hab ich zwar immer noch nicht verstanden, aber mit dem begrenzten Wissen würde ich es über eine Look-Up-Table lösen. Heisst: du legst einmal für jedes Ränge-Paar fest, wie deren Werte verändert werden sollen und holst dir dann immer nur diese ein "Tabellenzeile".

Beispiel:
PHP:
function megaCooleFunktion($name, $punkte_diff, $wins_diff, $lose_diff) {
	$sql = mysql_query("SELECT * FROM ranking WHERE username='$name'")or die(mysql_error());

	$erg = mysql_fetch_object($sql);
	$punkte_neu = $erg->punkte + $punkte_diff;
	$wins_neu = $erg->wins + $wins_diff;
	$lose_neu = $erg->lose + $lose_diff;
	
	$sql =  "UPDATE ranking SET punkte=$punkte_neu, wins=$wins_neu, lose=$lose_neu WHERE username='$name'";
	mysql_query($sql);
}

$lookUp["A"]["A"] = array(10*$MOTWADD, 1, -20, 0, 0, 1); //Reihenfolge: Punkte P1, Wins P1, Lose P1, Punkte P2, Wins P2, Lose P2 
$lookUp["A"]["D-"] = array(10*$MOTWADD, 1, 0, 0, 0, 1);
// etc.
$lookUp["A"]["C+"] = array(55, 1, 0, 7, -5, 1);

$paar = $lookUp[$p1][$p2];
megaCooleFunktion($p1, $paar[0], $paar[1], $paar[2]);
megaCooleFunktion($p2, $paar[3], $paar[4], $paar[5]);

Getestet ist das natürlich nicht, funktionieren sollte es aber. Es ist nicht die schönste Variante, aber besser als siebzehntausend if-else.


Duddle
 

saila

Moderatorle

AW: 40+ if bedingungen Abkürzen

Hi,

also ich habe mir das mal im groben durchgelesen. Wenn ich es richtig verstanden habe geht es um ein Ranking-System, welches einen Gewinner ermitteln soll - wenn korrekt bitte ansonsten noch mal genauer erläutern um was es geht.

Wenn also ein User mit dem höchsten Ranking gewinnen kann, warum wird dann das ganze nicht mit MAX (Teil eines Query-Statements) einach aus der Tabelle gelesen und entsprechend ausgegeben?

Wenn es um die Wertungspunkte geht - sprich es wird eine Wertung ausgelöst um einem User eine bestimmte Punktzahl zu übergeben - Warum wird hierfür nicht ein Array heraugezogen mit den Entsrechenden Werten?

Falls es ein Eingabefeld gibt, um Punkt selbst einzugeben wäre das noch was anderes, aber im Grunde gibt es eine Tabelle:

Points
1 = 100
2 = 200
usw..

Diese ganzen if/elseif usw. kann man im Grunde in die Tonne geben, wenn man etwas logischer dahinter steigt. Weil - ein Array mit den Werten kann das Ergebnis direkt liefern ohne irgendwelche if's. Von mir aus auch ein mehrdimensionales Array.

Dieses Punkte-Array kann auch in der DB als Array gespeichert werden - Stichwort: ******ize.

Um letztlich hinter den Gedanken des Rankingsystems zu blicken müsste man zumindest mal den Tabellenaufbau sehen und genau wissen, durch was ein User Punkte bekommen kann und warum es eine Punktespanne gibt.

Alle Quellcodes sind schrecklich - bislang :)

Im Grunde sind das drei Tabellen.

User-Table
Points-Table
Rank-Table

Letztere Tabelle könnte man sich sparen durch ein weiteres Feld in der User-Table.

Die Points-Table würde z.B. so aussehen:

id, point
1, 500
2, 1000
3, 2000
usw..

Durch die Punktevergabe kann man somit dann eine direkte Verbindung zu den Punkten herstellen und zurück liefern, um diese wiederum dem User zuzuweisen.

Wenn man somit eine Rankingliste haben möchte, fragt man einfach in der User-Table (sofern das Feld dort hinzugefügt wurde) mit MAX points ORDER BY points (als Ansatz) und erhält die entsprechende Liste.

Wenn es hoch kommt (in einfacher ausführung vielleicht ein 8-Zeiler :) )
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.067
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben