Suchen
Inside Forum
Nützliche Links




 
phpforum.de bei Facebook
 
phpforum.de bei Twitter
 

Zurück   PHP Forum: phpforum.de > PHP > PHP

PHP Alles rund um PHP

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 09.01.2017, 23:12
profexxi profexxi ist offline
Neuer Besucher
 
Registriert seit: 07.11.2008
Beiträge: 3
Standard Darts-Skript

Hi,

so kurz nach der Darts-WM würde ich gerne ein neues PHP-Projekt beginnen. Ich bin kein Anfänger und hab auch schon einiges in PHP geschrieben, jedoch liegt mein letztes Projekt schon viele Jahre zurück, so dass ich etwas "eingerostet" bin. Ich hoffe, hier kann mir der ein oder andere mit einzelnen Ansätzen oder Ideen helfen, mein Projekt umzusetzen.

Grundlegend soll es um die Statistik einer einzelnen Darts-Mannschaft gehen. Wir spielen häufig untereinander und protokollieren die Spiele auch mittels Stift und Papier. Sehr gerne würde ich das aber zukünftig eleganter gestalten und die Spielergebnisse in einer MySQL-Datenbank ablegen und mittels eines PHP-Skripts auslesen bzw. auswerten.

Gespielt wird eigentlich fast ausschließlich 501. Das heißt, jeder Spieler beginnt mit einem Punktestand von 501 und muss diesen auf 0 runterspielen. Hierbei wird abwechselnd mit jeweils 3 Dartpfeilen auf die Scheibe geworfen und die erzielten Punkte entsprechend ihrer Wertigkeit von der Restsumme abgezogen. Soweit, so gut.

Mein Problem ist nun, dass ich bereits an der grundlegensten Frage hänge, wie ich das am besten realisiere. Meine Überlegung geht nun dahin, eine Tabelle mit folgenden Feldern anzulegen und entsprechend mit Inhalt zu befüllen:

id - spiel - spieler - wurf - score
---------------------------------------
1 - 1 - Hans - 1 - 86
2 - 1 - Peter - 1 - 43
3 - 1 - Markus - 1 - 112
4 - 1 - Hans - 2 - 49
5 - 1 - Peter - 2 - 94
6 - 1 - Markus - 2 - 66
7 - 1 - Hans - 3 - 74
...
...
...
59 - 2 - Hans - 1 - 59
60 - 2 - Peter - 1 - 82
..
..
..
usw.


Jetzt sollte ich das ganze via PHP auslesen und entsprechend in einer Tabelle wiedergeben. Hierbei sollten zuerst die Anzahl der Spieler pro Spiel erkannt werden und dann jeweils deren Würfe untereinander in einer Tabelle ausgegeben und berechnet werden. Sprich, die jeweiligen Würfe von der Restsumme (bzw. beim ersten Wurf von 501) abgezogen werden. Beispiel zum oben genannten Datenbankinhalt:

Code:
+-------+---------+----------+
| Hans  | Peter   | Markus   |
+-------+---------+----------+
| 501   | 501     | 501      |
| 415   | 458     | 389      |
| 366   | 364     | 323      |
| 292   |
...
...
...
| 0     | 117     |  26      |
+-------+---------+----------+


Zunächst dachte ich mir, dass ich das problemlos hinbekomme. Nachdem ich anfangen wollte, kamen mir aber die ersten grundlegenden Gedanken, wie das ganze funktionieren soll ?

Zunächst einmal müsste ich per Datenbankabfrage herausfinden, wieviele Spieler überhaupt mitspielen. Sprich, wieviel verschiedene Namen sind pro Spiel-ID hinterlegt. Das dürfte mit folgender Abfrage kein Problem sein:

SQL Quellcode:
SELECT COUNT(DISTINCT spieler) AS anzahl FROM darts WHERE spiel='1'


Mithilfe dieser Anzahl könnte ich dann die HTML-Tabelle mit Spalten bestücken. Wie gehe ich aber nun weiter vor ? Soll ich z.B. für jede Spalte (Spieler) eine separate while-Schleife durchlaufen lassen, vor der Schleife einer Variable den Wert 501 ($score = 501;) geben und dann in der Schleife die ausgelesenen Datensätze (Würfe) von der Variable nacheinander abziehen, ausgeben und $score mit dem letzten berechneten Wert neu setzen ? Beispielsweise so:

PHP Quellcode:
$score = 501;
echo $score;
while ($row = mysql_fetch_array($result)) {
    $diff = $score - $row['score'];
    echo "<br>".$diff;
    $score = $diff;
}



Ich frage mich dabei nur, ob es ein Problem geben wird, da die Spieler eine unterschiedliche Anzahl an Würfen haben. Zum einen hat der Sieger eines Spiels, wenn man es nach dessen Finish beendet, auf jeden Fall einen Wurf mehr als alle anderen und die anderen haben den Endwert nicht auf 0. Zum anderen lassen wir häufig die weiteren Spieler weiterspielen, bis der wirklich letzte, der dann nicht mehr zu Ende spielt, ermittelt ist. In diesem Fall hätten die Spieler auch eine unterschiedliche Anzahl an Würfen.

Ihr seht, ich bin noch ziemlich verwirrt, was die Realisierung betrifft. Möglicherweise habe ich auch den ein oder anderen völlig falschen Gedankengang. Dies dürfte dann der Tatsache geschuldet sein, dass ich einfach viele Jahre gar nichts mehr mit PHP gemacht habe und mich erst wieder einfinden muss. Über eure Hilfestellungen würde ich mich auf jeden Fall sehr freuen.

Auf jeden Fall schon einmal besten Dank im Voraus :-)

Edit: Eine kleine Ergänzung noch. Weshalb das ganze so ausführlich gestaltet werden soll, hat zwei Gründe: Zum einen sollen die Spiele alle als genauer Spielablauf abrufbar sein, zum anderen sind wir alle ein bisschen Statistikfreaks. Das heißt, es sollen zusätzlich noch Statistiken für einzelne Spiele oder Spieler berechenbar sein, z.B.
- Wieviel Punkte hat ein Spieler im Schnitt mit 3 Darts geworfen (Tabellenfeld "wurf") - sowohl im jeweiligen Spiel als auch insgesamt seit Beginn der Aufzeichnung ?
- Wieviele Würfe hat ein Spieler im Schnitt benötigt, um ein Spiel zu beenden ?
- Wie oft hat ein Spieler gewonnen ?

Evt. wird das ganze später noch durch mehrere Legs, etc. erweitert. Aktuell genügt uns aber die Einzelspielstatistik.

Dass das ganze ein entsprechender Aufwand beim einpflegen der Daten ist, ist mir bewusst. Das macht aber auch nichts :-)

Geändert von profexxi (09.01.2017 um 23:23 Uhr) Grund: Ergänzung
Mit Zitat antworten
  #2  
Alt 10.01.2017, 11:09
Marc Ermshaus Marc Ermshaus ist offline
Forum-Mitarbeiter
 
Registriert seit: 06.09.2004
Beiträge: 5.384
Standard AW: Darts-Skript

Du bist zwar schon lange angemeldet, aber ich sage trotzdem mal: Willkommen im Forum.

Da du für den Aufbau der Darstellung zu einem Spiel wohl so oder so immer alle Daten des Spiels benötigst, würde ich das im SQL gar nicht so kleinschrittig angehen, sondern einfach alle Datensätze holen, also SELECT col1, col2, … FROM table WHERE spiel_id = $xy, und die Daten dann mit PHP weiter analysieren und verarbeiten.

(Möglicherweise wäre es noch ganz sinnvoll, die Spieler als eigene Tabelle anzulegen und in der Wurftabelle nicht den Namen einzutragen, sondern nur die ID des Spielers, und die Namen dranzujoinen oder mit einer zusätzlichen Query zu holen. Das könntest du bei Bedarf aber auch später noch umbauen. Andererseits wird die Eingabe der Daten aber so oder so so umständlich, dass du dir schnell Hilfe dazu programmieren wirst/solltest. (Ich würde mir was schreiben, das ein einfaches Textformat einlesen kann, das in etwa so aufgebaut ist wie deine geplante Ausgabe.) Wenn du das machst, kannst du auch die Spieler als eigene Tabelle anlegen, weil die Eintragungen so oder so automatisiert vorgenommen werden.)

Die Daten würde ich mir dann so umstellen:

PHP Quellcode:
$game = array(
    1 => array(
        'Hans'   => 86,
        'Peter'  => 43,
        'Markus' => 112
    ),
    2 => array(
        'Hans'   => 49,
        'Peter'  => 94,
        'Markus' => 66
    ),
    ...
);


Der Index auf erster Ebene ist wurf.

Dann kannst du es im Grunde einfach mit zwei geschachtelten Schleifen durchlaufen, um die Tabelle zu erzeugen.

An zusätzlichen Daten müsstest du noch ein Hilfs-Array der Form…

PHP Quellcode:
$pointsLeft = array(
    'Hans'  => 501,
    'Peter' => 501,
    ...
);


…anlegen, aus dem du pro Wurf die jeweilige Punktzahl abziehst, um die gewünschte Darstellung erreichen zu können.

Die beiden gezeigten Arrays würden natürlich dynamisch generiert – je nach den Daten eines Spiels.
Mit Zitat antworten
  #3  
Alt 12.01.2017, 01:22
profexxi profexxi ist offline
Neuer Besucher
 
Registriert seit: 07.11.2008
Beiträge: 3
Standard AW: Darts-Skript

Zitat:
Zitat von Marc Ermshaus Beitrag anzeigen
Du bist zwar schon lange angemeldet, aber ich sage trotzdem mal: Willkommen im Forum.
Vielen Dank :-) Ich hatte mich damals registriert und dann fehlte mir irgendwie die Zeit zum programmieren. Aber was lange wärt, wird auch mal gut... ;-)

Zitat:
Da du für den Aufbau der Darstellung zu einem Spiel wohl so oder so immer alle Daten des Spiels benötigst, würde ich das im SQL gar nicht so kleinschrittig angehen, sondern einfach alle Datensätze holen, also SELECT col1, col2, … FROM table WHERE spiel_id = $xy, und die Daten dann mit PHP weiter analysieren und verarbeiten.
Wenn ich aber direkt am Anfang alle Daten hole, wie finde ich später noch heraus, wieviele Spieler am Spiel teilnehmen ? Ich dachte über eine Abfrage mit DISTINCT könnte ich das vorab in Erfahrung bringen. Könntest Du mir das näher darlegen, wie Du das strukturieren würdest ? Ich stehe da wohl ein wenig auf dem Schlauch...



Zitat:
Die Daten würde ich mir dann so umstellen:

PHP Quellcode:
$game = array(
    1 => array(
        'Hans'   => 86,
        'Peter'  => 43,
        'Markus' => 112
    ),
    2 => array(
        'Hans'   => 49,
        'Peter'  => 94,
        'Markus' => 66
    ),
    ...
);


Der Index auf erster Ebene ist wurf.
Da knüpft sich mein vorheriges Verständnisproblem an. Wie erstelle ich ein dynamisches Array, ohne zu wissen, wieviele Würfe es insgesamt gab ? Wieviele Spieler mitspielen ? Das mit dem Umstellen verwirrt mich auch etwas.

Wenn ich z.B. einfach alle Daten aus der Datenbank für ein bestimmtes Spiel abrufe:

SQL Quellcode:
SELECT * FROM darts WHERE spiel='1'


dann bekomme ich ja immer zusammenhängende Datensätze (spieler, wurf, score - Beispiel: Hans, 1, 86
Es erschließt sich mir nicht, wie ich jetzt daraus ein dynamisches Array mit dem Wurf als Index erstelle. Ich kann ja keine Spieler zusammen gruppieren, da jeder Datensatz einzeln abgerufen wird. Konkret müsste das array dann ja so aussehen:

PHP Quellcode:
$game = array(
    1 => array(
        'Hans'   => 86
    ),
    1 => array(
        'Peter'  => 43
...
    ),
    ...
);


Hab ich irgendwo einen Denkfehler oder fehlen mir nur noch ein paar Zwischenschritte, um dort hinzugelangen, wie Du es meinst ?

Danke auf jeden Fall für deine Hilfestellung. Du bist mir eine große Hilfe :-)
Mit Zitat antworten
  #4  
Alt 12.01.2017, 09:29
Marc Ermshaus Marc Ermshaus ist offline
Forum-Mitarbeiter
 
Registriert seit: 06.09.2004
Beiträge: 5.384
Standard AW: Darts-Skript

Grundsätzlich kannst du die benötigten Informationen alle aus den von der DB gelieferten Daten ableiten.

Die Anzahl der Teilnehmer des Spiels ist beispielsweise die Anzahl der Einträge mit wurf=1. (Falls es keine exotischen Fälle gibt, dass Teilnehmer später einsteigen oder dergleichen.) Die Info ergibt sich durch die Gruppierung aber später im Grunde von allein.

Die Namen sind die spieler-Felder der besagten Einträge. (Dito Gruppierung.)

Die Anzahl der Würfe ist der höchste Wert des wurf-Felds eines der Einträge. Das ergibt sich bei einer Gruppierung, wie ich sie vorgeschlagen habe, aber auch von allein. Du gehst die Datensätze durch und das wurf-Feld eines Datensatzes ist eben immer der Index im gruppierten Array.

Es ist ein wenig knifflig zu erklären und in den Details auch ein wenig knifflig zu programmieren, aber das kommt durch die Aufgabe an sich.

Grob kann die Gruppierung in etwa so funktionieren, wobei $data die Datensätze aus der DB sind.

(Aus dem Kopf geschriebener Umriss/Anfang.)

PHP Quellcode:
$grouped = array();

foreach ($data as $item) {
    if (!array_key_exists($item['wurf'], $grouped)) {
        $grouped[$item['wurf']] = array();
    }

    $grouped[$item['wurf']][$item['spieler']] = $item['score'];
}

Geändert von Marc Ermshaus (12.01.2017 um 09:31 Uhr)
Mit Zitat antworten
  #5  
Alt 17.01.2017, 23:52
Marc Ermshaus Marc Ermshaus ist offline
Forum-Mitarbeiter
 
Registriert seit: 06.09.2004
Beiträge: 5.384
Standard AW: Darts-Skript

Etwas Gebastel/Prototyping:

PHP Quellcode:
<?php

$data = array();

$data[] = array(
    'id'      => 3,
    'spiel'   => 1,
    'spieler' => 'Markus',
    'wurf'    => 1,
    'score'   => 112
);

$data[] = array(
    'id'      => 4,
    'spiel'   => 1,
    'spieler' => 'Hans',
    'wurf'    => 2,
    'score'   => 49
);

$data[] = array(
    'id'      => 5,
    'spiel'   => 1,
    'spieler' => 'Peter',
    'wurf'    => 2,
    'score'   => 94
);

$data[] = array(
    'id'      => 1,
    'spiel'   => 1,
    'spieler' => 'Hans',
    'wurf'    => 1,
    'score'   => 86
);

$data[] = array(
    'id'      => 7,
    'spiel'   => 1,
    'spieler' => 'Markus',
    'wurf'    => 3,
    'score'   => 180
);

$data[] = array(
    'id'      => 8,
    'spiel'   => 1,
    'spieler' => 'Hans',
    'wurf'    => 3,
    'score'   => 80
);

$data[] = array(
    'id'      => 9,
    'spiel'   => 1,
    'spieler' => 'Peter',
    'wurf'    => 3,
    'score'   => 72
);

$data[] = array(
    'id'      => 2,
    'spiel'   => 1,
    'spieler' => 'Peter',
    'wurf'    => 1,
    'score'   => 43
);

$data[] = array(
    'id'      => 6,
    'spiel'   => 1,
    'spieler' => 'Markus',
    'wurf'    => 2,
    'score'   => 66
);

$data[] = array(
    'id'      => 10,
    'spiel'   => 1,
    'spieler' => 'Markus',
    'wurf'    => 4,
    'score'   => 143
);

$data[] = array(
    'id'      => 11,
    'spiel'   => 1,
    'spieler' => 'Hans',
    'wurf'    => 4,
    'score'   => 20
);

$data[] = array(
    'id'      => 12,
    'spiel'   => 1,
    'spieler' => 'Peter',
    'wurf'    => 4,
    'score'   => 95
);

$data[] = array(
    'id'      => 13,
    'spiel'   => 1,
    'spieler' => 'Hans',
    'wurf'    => 5,
    'score'   => 75
);

$data[] = array(
    'id'      => 14,
    'spiel'   => 1,
    'spieler' => 'Peter',
    'wurf'    => 5,
    'score'   => 80
);

/**
 * Sortiert die DB-Daten, um den Code für die Generierung des Scoreboards zu
 * vereinfachen
 *
 * Kann auch via SQL erledigt werden. Für Details zur Sortierung siehe auch
 * Kommentar zu `generateScoreboard`.
 *
 * @param array $data
 * @return array
 */

function sortData(array $data)
{
    usort($data, function ($a, $b) {
        if ($a['wurf'] !== $b['wurf']) {
            return ($a['wurf'] < $b['wurf']) ? -1 : 1;
        }

        return strcmp($a['spieler'], $b['spieler']);
    });

    return $data;
}

/**
 * Erzeugt eine Scoreboard-Datenstruktur, die auf einfache Weise dargestellt
 * werden kann
 *
 * Die Eingabedaten müssen
 *
 * 1. aufsteigend nach Wurf
 * 2. aufsteigend nach Spielername
 *
 * sortiert sein.
 *
 * @param array $sortedData
 * @return array
 */

function generateScoreboard(array $sortedData)
{
    $scoreboard = array();

    if (count($sortedData) === 0) {
        return $scoreboard;
    }

    $scoreboard[0] = array();

    $players = array();

    // Einen "Wurf 0" hinzufügen mit den Startpunktzahlen

    foreach ($sortedData as $d) {
        $scoreboard[0][$d['spieler']] = array(
            'remainingScore' => 501,
            'score'          => 0
        );
        $players[] = $d['spieler'];

        if ($d['wurf'] > 1) {
            break;
        }
    }

    foreach ($sortedData as $d) {
        // Stellt sicher, dass für jeden Wurf für jeden Spieler ein brauchbarer
        // Eintrag existiert
        if (!array_key_exists($d['wurf'], $scoreboard)) {
            $tmp = array();

            foreach ($players as $player) {
                $tmp[$player] = array(
                    'remainingScore' => $scoreboard[$d['wurf'] - 1][$player]['remainingScore'],
                    'score'          => 0
                );
            }

            $scoreboard[$d['wurf']] = $tmp;
        }

        $scoreboard[$d['wurf']][$d['spieler']] = array(
            'remainingScore' => $scoreboard[$d['wurf'] - 1][$d['spieler']]['remainingScore'] - $d['score'],
            'score'          => $d['score']
        );
    }

    return $scoreboard;
}

/**
 * @param array $scoreboard
 * @return string
 */

function renderScoreboardAsHtml(array $scoreboard)
{
    if (count($scoreboard) === 0) {
        return '';
    }

    $e = function ($s) {
        return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
    };

    $html = '<table>';

    $html .= '<thead><tr>';

    $html .= '<th>Wurf</th>';

    foreach (array_keys($scoreboard[0]) as $player) {
        $html .= '<th>' . $e($player) . '</th>';
    }

    $html .= '</tr></thead>';

    $html .= '<tbody>';

    foreach ($scoreboard as $round => $scores) {
        $html .= '<tr>';
        $html .= '<td>' . $e($round) . '</td>';
        foreach ($scores as $score) {
            $html .= '<td>' . $e($score['remainingScore']) . '</td>';
        }
        $html .= '</tr>';
    }

    $html .= '</tbody>';
    $html .= '</table>';

    return $html;
}



$data       = sortData($data);
$scoreboard = generateScoreboard($data);
$html       = renderScoreboardAsHtml($scoreboard);

echo $html;


PS: Ist nicht ganz die Datenstruktur, die ich hier im Thread schon beschrieben habe. Ich fand es letztlich doch sinnvoller, die „verbleibenden Punkte“ pro Spieler mit den Restdaten zu verbinden (var_dump($scoreboard);, um die Details zu sehen).

Geändert von Marc Ermshaus (18.01.2017 um 00:03 Uhr)
Mit Zitat antworten
  #6  
Alt 01.02.2017, 16:34
profexxi profexxi ist offline
Neuer Besucher
 
Registriert seit: 07.11.2008
Beiträge: 3
Standard AW: Darts-Skript

Hallo Marc,

zunächst einmal vielen herzlichen Dank für deine umfangreiche Hilfe. Bin wirklich begeistert, was Du kreiert hast obwohl ich solch eine Hilfe gar nicht erwartet habe. Insbesondere in der Arbeit mit Arrays habe ich noch große Lücken, weshalb deine Lösung meine Kenntnisse um ein Vielfaches überschritten hat. Ich hatte bislang einen Lösungsansatz mit verschachtelten Datenbankabfragen, die deutlich unsauberer waren.

Leider war ich die letzten Wochen sehr ausgelastet, weshalb ich mich erst jetzt wieder meinem Hobby widmen konnte. Sorry daher für die verspätete Antwort.

Inzwischen bin ich durch deinen Code auch soweit durchgestiegen und habe eine sehr gute, lauffähige Version gebastelt. Bei der Struktur der Daten habe ich nochmal etwas verändert: Es wird nun nicht mehr nur der Gesamtscore pro Wurf in der Datenbank gespeichert sondern jeder einzelne Dart eines Wurfs. Bedeutet:

- Wurf 1: T18 D20 20
- Wurf 2: T20 T20 5
etc.

Damit stünden noch weitere Statistikmöglichkeiten offen (Trefferquoten auf einzelne Felder, Stärken/Schwächen, etc.).

Damit ich die Berechnung des Scoreboards dennoch wie gewohnt durchführen kann, muss ich die Datensätze demnach erst in Zahlen umwandeln. Dafür habe ich mir eine kleine Funktion geschrieben, die den Beginn des Datensatzes jeden einzelnen Darts untersucht. Falls dieser mit einem "D" beginnt, wird dieser mit 2 multipliziert, falls dieser mit "T" beginnt mit 3..... und falls alle Abfragen keinen Treffer bringen, nur das einfache Ergebnis zurückgegeben. Im folgenden mein Code:

PHP Quellcode:
function score($dart) {
  if(preg_match("/^D/",$dart)) {
    $score = substr($dart, 1)*2;
  } elseif(preg_match("/^T/",$dart)) {
    $score = substr($dart, 1)*3;
  } elseif($dart == "Bull") {
    $score = 25;
  } elseif($dart == "Bullseye") {
    $score = 50;
  } elseif($dart == "-") {
    $score = 0;
    } else {
    $score = $dart;
  }
  return $score;
}


Nachfrage meinerseits: Wie sauber findest Du hier meine Lösung ? Hast Du evt. einen Ansatz zu einer eleganteren Lösung oder denkst Du, das ist schon in Ordnung so ?

Ferner habe ich mich nun an die Statistiken gewagt. Die Ergebnisse der Spiele werden jetzt alle korrekt ausgegeben - jetzt möchte ich zu den einzelnen Spielen die einzelnen Statistiken der Spieler auslesen, berechnen und ausgeben. Sprich: Wie oft hat Spieler x welches Feld getroffen ? Was war sein höchster Score mit einem Wurf und wie oft ist ihm dieser gelungen ? Etc.

Hier habe ich auch schon ein paar Ansätze und hänge momentan an einem Problem, das ich irgendwie nicht gelöst bekomme. Im Folgenden geht es darum, die Häufigkeit der einzelnen getroffenen Felder auszugeben:

PHP Quellcode:
$result_stats = mysql_query("SELECT * FROM ".$table_darts_games." WHERE spieler='".$_GET['spieler']."'");

// Leeren String vorbereiten
$darts = "";

while ( $row = mysql_fetch_array($result_stats)) { 
  if ($row[dart1] !== "") {
    $darts .= $row[dart1].";";
  }
  if ($row[dart2] !== "") {
    $darts .= $row[dart2].";";
  }
  if ($row[dart3] !== "") {
    $darts .= $row[dart3].";";
  }
 
}

// Letztes Semikolon abschneiden
$darts = substr($darts, 0, -1);

// Die Zeichenketten in Arrays umwandeln
$dart = explode(";", $darts);

// Array nach Häufigkeit der Felder erstellen
$temp = array_count_values($dart);
arsort($temp);

echo "<table border=\"1\">";
echo "<tr>";
echo "<td colspan=\"2\"><b><font size=\"3\">Getroffene Felder</font></b></td>";
echo "</tr>";
echo "<tr>";
echo "<td align=\"center\">Feld</td>";
echo "<td align=\"center\">Anzahl</td>";
echo "</tr>";
foreach ($temp as $key => $value) {
 $ergebnis[] = array($key, $value);
 echo "<tr>";
 echo "<td align=\"center\">".$key."</td>";
 echo "<td align=\"center\">".$value."x</td>";
 echo "</tr>";
}
echo "</table>";


Hierzu mein Problem: Die Ausgabe passt zunächst soweit. Es werden alle getroffenen Felder ausgegeben mit deren Häufigkeit danach und es wird nach der Häufigkeit sortiert. Gerne würde ich die Sortierung aber noch etwas ausbauen.

Aktuell wird mir folgendes angezeigt:

T18 - 7x
D20 - 6x
9 - 4x
D10 - 4x
12 - 4x
T3 - 3x
19 - 3x

etc.

Ich würde gerne zuerst nach dem Wert (wie bisher sortieren) und anschließend nach dem Key, wobei hier zuerst das "Bullseye", dann "Bull", dann die Triple-Felder absteigend (T20, T19, T18), dann die Doppel-Felder absteigend (D20, D19, D18, D17...) und dann zuletzt die einfachen Felder absteigend (20, 19, 18, 17, 16...) angezeigt werden sollen ), dann die , so dass es so ausschaut:

T18 - 7x
D20 - 6x
D10 - 4x
12 - 4x
9 - 4x
T13 - 3x
19 - 3x

Sprich, die Sortierung so:

1.) Nach Häufigkeit
2.) Nach: Bullseye, Bull, T20, T19, T18.... T1, D20, D19, D18, D17, D16... D1, 20, 19, 18, 17, 16.... 1

Hast Du da eine Idee, wie das zu bewerkstelligen wäre ? Vermutlich mit den vorhandenen PHP-Funktion nicht zu realisieren oder ? Mit array_multisort komme ich aufgrund der unterschiedlichen alphabetischen Abläufe auch nicht weiter.

Mein letztes Anliegen betrifft die Anzahl der Siege auf der Gesamt-Statistik-Seite eines einzelnen Spielers: Dadurch, dass das Scoreboard anhand der in der Datenbank vorhandenen Daten immer erst den Sieger des jeweiligen Spiels ausrechnet - und dieser nicht bereits in der Datenbank gespeichert ist - werde ich wohl die Anzahl der Siege nur ermitteln können, wenn ich alle Tabellendaten der Spiele auslese, diese berechnen lasse und dann die Siege entsprechend addiere und ausgebe. Eine elegante Lösung wird demnach wohl nur Abhilfe bringen, wenn ich zu jedem Spiel in einer separaten Tabelle die Endresultate (Platzierung, Durchschnitt, Benötigte Würfe...) abspeicher und dann abrufe, oder ?

Vielen Dank auf jeden Fall für deine Hilfe. Du siehst, ich beschäftige mich sehr damit und bin auch für jeden einzelnen Anstoß, den Du einbringst, sehr dankbar :-)

Viele Grüße
Mit Zitat antworten
  #7  
Alt 11.02.2017, 04:53
Marc Ermshaus Marc Ermshaus ist offline
Forum-Mitarbeiter
 
Registriert seit: 06.09.2004
Beiträge: 5.384
Standard AW: Darts-Skript

Bevor ich gar nicht mehr zu einer Antwort komme, antworte ich zumindest mal etwas kürzer:

Die score-Funktion ist für den Moment okay. Sie dürfte bei korrekten Eingaben korrekt funktionieren, aber einige Anmerkungen:

- preg_match ist unnötig. Es tut auch substr oder strpos.
- Die Funktion gibt im else-Fall keinen Integer zurück, sondern einen String.
- Typschwache Vergleiche (== statt ===) in PHP sind etwas unübersichtlich. Beispielsweise ist (0 == 'Bullseye') in PHP wahr (0 allerdings als Integer, nicht als String). Besser mit === arbeiten.
- Um die Funktion flexibler einsetzbar zu machen, könntest du noch die Eingaben auf Korrektheit prüfen. Das muss jetzt nicht unbedingt, aber wenn du mal versehentlich "30" oder so eintippst statt "20" winkt die Funktion das durch. So wird es unter Umständen schwierig, Fehler zu bemerken.

Zitat:
Hast Du da eine Idee, wie das zu bewerkstelligen wäre ? Vermutlich mit den vorhandenen PHP-Funktion nicht zu realisieren oder ? Mit array_multisort komme ich aufgrund der unterschiedlichen alphabetischen Abläufe auch nicht weiter.
Im Zweifel immer per usort.

- http://php.net/manual/en/function.usort.php

Zitat:
Eine elegante Lösung wird demnach wohl nur Abhilfe bringen, wenn ich zu jedem Spiel in einer separaten Tabelle die Endresultate (Platzierung, Durchschnitt, Benötigte Würfe...) abspeicher und dann abrufe, oder ?
Ja, zum Beispiel. Dann ergibt sich eben etwas das Problem, das synchronisiert halten zu müssen. Alternativ könntest du auch die Statistikseite nur alle halbe Stunde neu berechnen (komplett aus den Spieldaten) und dann vorberechnet abspeichern und einlesen (Caching).

Aber: Es dürfte moderne Hardware nicht wirklich in Nöte bringen, das auch bei jedem Aufruf komplett zu berechnen, auch wenn es natürlich nicht in dem Sinne sinnvoll ist. Das ist letztlich eine Frage der Skalierung. Bei drei Spielern gerätst du da vermutlich sehr lange nicht an irgendwelche spürbaren Grenzen.

Das wäre insgesamt aber wohl ein Thema, das sich später bei Bedarf noch eleganter lösen ließe und das man erst mal auch einfach mit ständigen Neuberechnungen lösen kann.

Wenn du irgendwann berechnete Daten ablegen möchtest, kannst du die ja aus den „Stammdaten“ zu einem Spiel jederzeit auch nachträglich noch generieren.

Geändert von Marc Ermshaus (11.02.2017 um 08:29 Uhr)
Mit Zitat antworten
  #8  
Alt 11.02.2017, 23:39
Marc Ermshaus Marc Ermshaus ist offline
Forum-Mitarbeiter
 
Registriert seit: 06.09.2004
Beiträge: 5.384
Standard AW: Darts-Skript

PHP Quellcode:
<?php

/**
 * Returns an array of the "names" for all possible darts
 *
 * The returned array will be sorted like this:
 *
 * - Bullseye
 * - Bull
 * - T20 ... T1
 * - D20 ... D1
 * -  20 ...  1
 *
 * @return array
 */

function getPossibleDarts()
{
    $darts = array('Bullseye', 'Bull');

    foreach (array('T', 'D', '') as $modifier) {
        for ($i = 20; $i >= 1; $i--) {
            $darts[] = $modifier . $i;
        }
    }

    return $darts;
}

/**
 * Returns an array of random darts
 *
 * Example:
 *
 *     array('D5', 'T10', '12', 'Bull', 'T10', '9', ...)
 *
 * @param $amount
 * @return array
 */

function generateRandomDarts($amount)
{
    $possibleDarts = getPossibleDarts();

    $max = count($possibleDarts) - 1;

    $darts = array();

    for ($i = 0; $i < $amount; $i++) {
        $darts[] = $possibleDarts[mt_rand(0, $max)];
    }

    return $darts;
}

/**
 * @param array $darts
 * @return array
 */

function groupAndSortDarts(array $darts)
{
    $ret = array();

    foreach ($darts as $dart) {
        if (!array_key_exists($dart, $ret)) {
            $ret[$dart] = array(
                'dart'   => $dart,
                'amount' => 0
            );
        }

        $ret[$dart]['amount']++;
    }

    $tmp = array_flip(getPossibleDarts());

    usort($ret, function ($a, $b) use ($tmp) {
        if ($a['amount'] > $b['amount']) {
            return -1;
        }

        if ($a['amount'] < $b['amount']) {
            return 1;
        }

        if ($tmp[$a['dart']] < $tmp[$b['dart']]) {
            return -1;
        }

        if ($tmp[$a['dart']] > $tmp[$b['dart']]) {
            return 1;
        }

        return 0;
    });

    return $ret;
}



$darts = generateRandomDarts(1000);

$tmp = groupAndSortDarts($darts);

foreach ($tmp as $e) {
    echo $e['dart'] . ': ' . $e['amount'] . "\n";
}


Beispielausgabe:

Code:
T10: 27
D17: 24
T9: 23
7: 23
1: 23
14: 22
6: 22
T11: 21
D16: 21
8: 21
Bull: 20
20: 20
15: 20
12: 20
D20: 19
D18: 19
D15: 19
D7: 19
T19: 18
T12: 18
19: 18
Bullseye: 17
T18: 17
T15: 17
T8: 17
T5: 17
D3: 17
D2: 17
T16: 16
T3: 16
D4: 16
13: 16
11: 16
5: 16
T17: 15
T2: 15
T1: 15
D13: 15
D12: 15
D8: 15
D6: 15
D5: 15
T20: 14
T6: 14
18: 14
T13: 13
T4: 13
D14: 13
D11: 13
2: 13
T7: 12
17: 12
T14: 11
D19: 11
16: 11
9: 11
D9: 10
D1: 10
10: 9
D10: 8
4: 8
3: 8
Mit Zitat antworten


Antwort

Lesezeichen

Themen-Optionen
Ansicht

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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu
Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Dateiupload Datei an Skript ohne Skript im Broser an zuzeigen fruitgnome PHP 8 16.03.2011 20:01
Über PHP-Skript ein weiteres PHP-Skript auf ausführen clown011182 PHP 2 07.02.2007 22:01
Captchas-Skript in Gästebuch-Skript einbauen tibero PHP 6 03.02.2006 07:57
Zweites Skript setzt erstes Skript ausser Gefecht silber JavaScript 2 24.07.2005 17:53


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:12 Uhr.


Powered by vBulletin® Version 3.8.8 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Powered by NuWiki v1.3 RC1 Copyright ©2006-2007, NuHit, LLC