PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks. |
 |
|

07-02-2012, 19:31
|
Wasser_Wanderer
Registrierter Benutzer
|
|
Registriert seit: Aug 2011
Beiträge: 225
|
|
Quote Berechnen bei zB 7 Teilnahmen
Hallöchen,
ich bins mal wieder und hoffe das ich mein Problem richtig beschreiben kann:
Ich habe eine Auflistung von Spielergebnissen. Pro Spiel/Turnier gibt es einen eindeutigen Timestamp.
Ziel: Ich möchte zb 7 Turniere auswerten. Pro Spiel gibt es eine Quote.
Beispiel: Spieler A hat in Spiel 1 eine Quote von 33,33, in Spiel 2: 50,00 usw.
Dann möchte ich die einezelnen Quoten addieren. In einem Beispiel: Qoute = 83,33
Grundlage (Auszug) ist folgende Datei (elo.php):
PHP-Code:
PekingPeter;Sir ConnorMcleod;1;2;1316725136 DJ Avalon45;PowerCyborg;2;1;1316725136 hexenwesen10;Snoopyy;2;0;1316725136 akropolis1962;Ass53;0;2;1316725136 Niam47;Arwen7614;0;2;1316725136 Sir ConnorMcleod;DJ Avalon45;2;0;1316725136 hexenwesen10;Ass53;0;2;1316725136 Arwen7614;Sir ConnorMcleod;0;2;1316725136 hexenwesen10;Arwen7614;0;2;1316725136 Ass53;Sir ConnorMcleod;2;0;1316725136 DJmünstermaus;Ass53;2;0;1316814183 ConnorMcleod;PowerCyborg;1;2;1316814183 16-coon;Snoopyy;1;2;1316814183 DJ Avalon45;Niam47;1;2;1316814183 akronis;hexenwesen10;2;1;1316814183 DJmünstermaus;PowerCyborg;1;2;1316814183 Snoopyy;Niam47;2;1;1316814183 akronis;PowerCyborg;2;0;1316814183 Niam47;PowerCyborg;0;2;1316814183 Snoopyy;akronis;0;2;1316814183 Angel Missing;DJ Avalon45;0;2;1316980069 PowerCyborg;akronis;1;2;1316980069 hexenwesen10;Ass53;1;2;1316980069 helle 65;Snoopyy;2;0;1316980069 Jumping Bill;Niam47;2;0;1316980069 Mamasschlumpf78;dasgehtjetztnich;1;2;1316980069 DJ Avalon45;akronis;0;2;1316980069 Ass53;helle 65;2;0;1316980069 Jumping Bill;dasgehtjetztnich;1;2;1316980069 akronis;Ass53;0;2;1316980069 Jumping Bill;akronis;0;2;1316980069 dasgehtjetztnich;Ass53;0;2;1316980069
Die lese ich so ein:
PHP-Code:
$datei = file("elo.php"); $tuni_anzahl = array(); $tabelle = array(); foreach ($datei as $items){ list ($name_1,$name_2,$erg_1,$erg_2,$timestamp) = explode(";",$items);
$tabelle[$name_1]['gew'] += $erg_1; $tabelle[$name_1]['verl'] += $erg_2; $tabelle[$name_2]['gew'] += $erg_2; $tabelle[$name_2]['verl'] += $erg_1; #$tabelle[$name_1][$tuni_anzahl] = ($timestamp+=1); #$tabelle[$name_2]['timestamp'] += $timestamp;
} print "<pre>"; #print_r ($tabelle); print "</pre>";
$tuni_anzahl = array(); foreach ($datei as $index => $item){ list ($name_1,$name_2,$erg_1,$erg_2,$timestamp) = explode(";",$item);
$tuni_anzahl[$timestamp] += 1; }
$result = array (); foreach ($tabelle as $name => $value){ // Quote ermitteln $quote = $value['gew']/($value['gew']+$value['verl'])*100; // Quote Nachkommastellen formatieren $quote = number_format($quote,3); // Name und Quote ins Array
$result[$name]['quote'] = $quote; $result[$name]['saetze-gewonnen'] = $value['gew']; $result[$name]['saetze-verloren'] = $value['verl'];
} arsort($result); // Ausgabe echo "<table border =\"1\">
<tr> <td align=center> Platz </td> <td > Name </td> <td align=center> Quote </td> <td align=center>Sätze<br> Gewonnen </td> <td align=center>Sätze<br> Verloren </td> </tr>
"; echo "Anzahl der gewerteten Turniere waren => ".count($tuni_anzahl)."<br>"; echo "Die Quote wird so ermittelt:<br>Sätze_Gewonnen ÷ (Sätze_Gewonnen + Sätze_Verloren)×100<br>Es wird auf 3 Nachkommastellen gerundet<br>"; $row_col_1 = "#094E99"; // Reihenfarbe 1 $row_col_2 = "#033780"; // Reihenfarbe 2 $row_start = 0; // Startzähler für die Reihenfarben $platz =1; // Startzähler für die Platzierungen foreach ($result as $name => $value){ $farbe = ($row_start % 2 == 0) ? $row_col_1 : $row_col_2; $value['quote'] = number_format($value['quote'],3,',',''); echo " <tr style=\"background-color:".$farbe.";\"> <!-- <tr> //--> <td align=center>".$platz++."</td> <td> ".$name." </td>
<td align=center> ".$value['quote']." </td> <td align=center>".$value['saetze-gewonnen']."</td> <td align=center>".$value['saetze-verloren']."</td> </tr> "; $row_start++; } echo "</table>";
Leider ist es so, dass ich alle Spiele als Quote bekomme. Das ist natürlich sinnlos, wenn ein Spieler einmal mitmacht, und dann alles zu 0 gewonnen hat.
Dann hat der ja 100% und da kommt keiner mehr ran.
Deshalb möchte ich gerne pro Turnier seine Quote und dann nur die letzten zb. 7 Teilnahmen addieren.
Ich hoffe ich konnte mich verständlich ausdrücken.
|

08-02-2012, 09:43
|
streuner
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Ort: Lüneburg
Beiträge: 623
|
|
Hi,
mir ist das Problem noch unklar (ist das eine Elo Zahlen Ermittelung für's Schach?).
Zitat:
Deshalb möchte ich gerne pro Turnier seine Quote und dann nur die letzten zb. 7 Teilnahmen addieren.
|
Was machst Du, wenn er gar nicht 7 Teilnahmen hat? Bei der Variante lässt du einige Faktoren auch weg (wenn ich jetzt vom Schach ausgehe): dort würde ich als Kriterium auch noch die Stärke des Turniers (Fide-Meister, GM usw...) mit einbeziehen durch z.B. den durchschnittlichen Elo Wert!
Mit Quote meinst du, wie viele Spiele z.B. gewonnen oder remisiert auf die Gesamtanzahl pro Turnier? Und wo ist das Problem, dass dann ins Verhältnis zu allen Turnieren zu setzen und eine Durchschnittsquote zu berechnen???
mfg streuner
__________________
Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.
"Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"
|

08-02-2012, 14:40
|
Wasser_Wanderer
Registrierter Benutzer
|
|
Registriert seit: Aug 2011
Beiträge: 225
|
|
Hallo Streuner,
es geht nicht um ELO, sondern die Quote: Gewonne Spiele zu verlorene Spiele (es gibt kein Remis).
Diese erechnet sich so:
Sätze_Gewonnen /(Sätze_Gewonnen + Sätze_Verloren) x 100
Zur Zeit habe ich nur eine Gesamt-Quote, also ALLE Spiele.
Es sollte aber sein:
Die letzten 7 Turniere seperat die Quote, und diese dann zusammen zählen.
Hat jemand weniger als 7 Turniere, dann werden eben nur diese gewertet.
Die Turniere sind durch den Timestamp separiert (Pro Timestamp ein Turnier)
|

08-02-2012, 14:46
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 3.296
|
|
Deinen Weg finde ich gut.
Mach das doch so!
Wo ist dein Problem?
PS:
Ich habe ein Problem!
Ich muss 3m scrollen.
|

08-02-2012, 15:10
|
Wasser_Wanderer
Registrierter Benutzer
|
|
Registriert seit: Aug 2011
Beiträge: 225
|
|
Mein Problem ist (pro Spieler):
a) wie errechne ich pro Turnier und Spieler seine Quote
b) wie addiere ich dann seine letzten zb 7 Quoten zusammen
Leider komme ich mit Schleifen wie for oder while nicht klar. Da bin ich wohl zu dumm. Sorry
|

08-02-2012, 15:11
|
streuner
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Ort: Lüneburg
Beiträge: 623
|
|
Ich kann mich combie nur anschließen: ich finde den Weg, den Du vorhast zu gehen, auch sinnvoll. Woran hakt es den jetzt? Gibt es eigentlich noch Kriterien für die Turniere (gleich gewertet)?
mfg streuner
__________________
Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.
"Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"
|

08-02-2012, 19:55
|
Wasser_Wanderer
Registrierter Benutzer
|
|
Registriert seit: Aug 2011
Beiträge: 225
|
|
Sodele ich bin nun ein Stück weiter gekommen und
bekomme nun die addierten gewonnen und verlorenen Spiele
pro Turier so:
PHP-Code:
$tuni_anzahl = array(); foreach ($datei as $index => $item){ list ($name_1,$name_2,$erg_1,$erg_2,$timestamp) = explode(";",$item);
$tuni_anzahl[$timestamp][$name_1]['gew'] += $erg_1; $tuni_anzahl[$timestamp][$name_1]['verl'] += $erg_2; $tuni_anzahl[$timestamp][$name_2]['gew'] += $erg_2; $tuni_anzahl[$timestamp][$name_2]['verl'] += $erg_1; } print "<pre>"; print_r($tuni_anzahl); print "</pre>";
Ausgabe (Auszug):
Array ( [1316725136 ] => Array (
[PekingPeter] => Array ( [gew] => 1 [verl] => 2 )
[Sir ConnorMcleod] => Array ( [gew] => 6 [verl] => 3 )
[DJ Avalon45] => Array ( [gew] => 2 [verl] => 3 )
[PowerCyborg] => Array ( [gew] => 1 [verl] => 2 )
[hexenwesen10] => Array ( [gew] => 2 [verl] => 4
usw.
Nun weis ich nicht wie ich:
a) die Quote ausrechnen soll: Quote= Gewonnen/(gewonnen + verloren)/100
b) Diese dann pro Turnier/Spieler zb 7x addiere
Schonmal danke für Euren Input
|

09-02-2012, 09:41
|
streuner
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Ort: Lüneburg
Beiträge: 623
|
|
Hm..vielleicht verstehe ich das jetzt nicht, aber warum setzt du deine ermittelten gewoonen/verlorenen Werte nicht einfach in deine Formel Quote= Gewonnen/(gewonnen + verloren)/100 ein und durchläufst das für jeden User mit einer Schleife (als Beispiel)!
mfg streuner
__________________
Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.
"Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"
|

09-02-2012, 15:12
|
Wasser_Wanderer
Registrierter Benutzer
|
|
Registriert seit: Aug 2011
Beiträge: 225
|
|
Zitat:
Zitat von streuner
Hm..vielleicht verstehe ich das jetzt nicht, aber warum setzt du deine ermittelten gewoonen/verlorenen Werte nicht einfach in deine Formel Quote= Gewonnen/(gewonnen + verloren)/100 ein und durchläufst das für jeden User mit einer Schleife (als Beispiel)!
mfg streuner
|
Lieber Streuner,
wie ich gestern 13:10 Uhr schon anmerkte, das ich mit Schleifen
leider nicht zurecht komme
|

09-02-2012, 15:15
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 3.296
|
|
Dann machs dir doch mit array_map() oder array_walk() und array_filter() oder was weiß ich.
Es geht auch ohne Schleifen.
PS:
Wenn du wirklich und ernsthaft programmieren willst, dann kommst du um Schleifen nicht drum rum.
|

09-02-2012, 18:19
|
Wasser_Wanderer
Registrierter Benutzer
|
|
Registriert seit: Aug 2011
Beiträge: 225
|
|
Ich hab es nun ohne Schleife hinbekommen:
PHP-Code:
foreach ($datei as $index => $item){ list ($name_1,$name_2,$erg_1,$erg_2,$timestamp) = explode(";",$item);
$timestamp = date('Y.m.d. H:i',$timestamp); // Einzelspiele (gewonnen, verloren)addieren $tuni_anzahl[$timestamp][$name_1]['gew'] += $erg_1; $tuni_anzahl[$timestamp][$name_1]['verl'] += $erg_2; $tuni_anzahl[$timestamp][$name_2]['gew'] += $erg_2; $tuni_anzahl[$timestamp][$name_2]['verl'] += $erg_1; //Aus den Additionen die Quote errechnen und auf 3 Nachkommastellen // runden $tuni_anzahl[$timestamp][$name_1]['quote'] = number_format($tuni_anzahl[$timestamp][$name_1]['gew']/($tuni_anzahl[$timestamp][$name_1]['gew']+$tuni_anzahl[$timestamp][$name_1]['verl'])*100,3); $tuni_anzahl[$timestamp][$name_2]['quote'] = number_format($tuni_anzahl[$timestamp][$name_2]['gew']/($tuni_anzahl[$timestamp][$name_2]['gew']+$tuni_anzahl[$timestamp][$name_2]['verl'])*100,3);
} //Nach Datum sortieren. krsort() weil Key rückwärts/absteigend sortiert wird krsort($tuni_anzahl); print "<pre>"; print_r($tuni_anzahl); print "</pre>";
Nun habe ich alle einzel quoten pro turnier absteigend nach Datum.
Wenn mir nun nur noch jemand hilft, daraus ein indiziertes array zu machen, was so aufgebaut ist:
PHP-Code:
$einzel_qoute= array ( array('name','gew','verl','quote'), // usw....
Dann schaffe ich den Rest
|

09-02-2012, 21:01
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 3.296
|
|
|

09-02-2012, 22:07
|
streuner
Registrierter Benutzer
|
|
Registriert seit: Aug 2009
Ort: Lüneburg
Beiträge: 623
|
|
@Wasser_Wanderer: hier PHP: Arrays - Manual kannst Du selber sehen, wie du ein so ein Array erstellen kannst
mfg streuner
__________________
Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.
"Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"
|

11-02-2012, 17:03
|
Guenni61
Registrierter Benutzer
|
|
Registriert seit: Nov 2011
Ort: Viersen
Beiträge: 128
|
|
Hi Wasser_Wanderer,
die Funktion print_r(array $array) , die du immer verwendest, zeigt dir doch die Struktur
deines Arrays "$tuni_anzahl", bzw. die Verschachtelung.
Da siehst du, dass das Array 3 Elemente mit dem Timestamp als Index hat.
In jedem der 3 Elemente gibt es wiederum Arrays, die einen Namen als Index haben.
Diese Arrays enthalten ein Array mit "gew", "verl", "quote" als Elemente.
Mit einer verschachtelten foreach-Schleife kannst du "$tuni_anzahl" aufdröseln, heißt, dich bis
zu der Ebene bewegen, die du brauchst, um ein indiziertes Array mit Werten zu füllen.
Hört sich blöd (kompliziert) an, kann es aber nicht anders erklären.
Mit "foreach($tuni_anzahl as $day => $values) . . . " ermittelst du den Index "Timestamp" und die
nächste Ebene. $day enthält den Timestamp, $values das nächste Array (Ebene)Somit .
Innerhalb dieser Schleife dröselst du "$values" auf: "foreach($values as $name => $quotes)".
$name enthält den Index des Arrays $quotes, $quotes die Elemente "gew", "verl", "quote".
Somit sind wir am Ende und erstellen ein indiziertes Array:
foreach($tuni_anzahl as $day => $values){
//echo '<p>'.$day.'</p>';
foreach($values as $name => $quotes){
//echo '<p>'.$name.'</p>';
$einzel_qoute[]=array('name' => $name, 'Gew' => $quotes['gew'], 'Verl' => $quotes['verl'], 'Quote' => $quotes['quote']);
}
}
Gruß
Günni
|

11-02-2012, 20:49
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.727
|
|
@Wasser_Wanderer
Bitte brich deinen Quellcode um. Ich muss selbst bei einer Auflösung von 1920x1080 horizontal scrollen.
Danke
Peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Thema bewerten |
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|