PHP Platzierung-Script: Selber Platz bei gleicher Punktzahl

Pfandfinder

Lieutenant
Registriert
Nov. 2020
Beiträge
619
hi,

ich will gerade in PHP eine Ergebnisausgabe der Platzierungen schreiben. wenn Spieler die gleiche Punktzahl haben sollen diese in der selben Zeile erscheinen und somit den selben Platz haben. mein Script:

PHP:
$i = 0;
$medaillenZaehlung = 0;
$letztePunkte = 0;
$ergebnis = '';
$sql = 'SELECT * FROM Game WHERE friends = "abc" ORDER BY punktzahl DESC';
foreach($pdo->query($sql) as $row)
{
    $i++;
    $displayname = $row['nutzername'];

    if($i > 0)
    {
        if($letztePunkte == $row['punktzahl'])
        {
            $ergebnis = substr_replace($ergebnis, '', -12); // GEHT NICHT!
            $ergebnis .= ' & '.$displayname.' <u>'.$row['punktzahl'].'</u> Münzen';
        }else{
            $normalerDurchgang = true;
        }
    }else{
        $normalerDurchgang = true;
    }

    if(isset($normalerDurchgang))
    {
        $medaillenZaehlung++;
        $medaille = '';
        if($medaillenZaehlung == 1)
        {
            $medaille = '🥇 ';
        }elseif($medaillenZaehlung == 2)
        {
            $medaille = '🥈 ';
        }elseif($medaillenZaehlung == 3)
        {
            $medaille = '🥉 ';
        }
        $ergebnis .= '&#10;'.$medaille.$displayname.': <u>'.$row['punktzahl'].'</u> Münzen';
    }

    $letztePunkte = $row['punktzahl'];
    unset($normalerDurchgang);
}

echo $ergebnis;

Das klappt soweit auch, aber die Ausgabe ist nicht schön:

Code:
🥇 Spieler1: 69 Münzen & Spieler 69 Münzen

Ich möchte dass die Ausgabe in etwa so aussieht :

Code:
🥇 Spieler1 & Spieler2: 69 Münzen

Daher habe ich die Zeile 15 hinzugefügt, allerdings erhalte ich dann gar keine echo Ausgabe mehr. im Serverlog steht aber auch kein Error.

was ist falsch ? Oder wie setze ich das am besten um ?
 
Persönlich würde ich mir eine Map bauen, Schlüssel sind Punkte und die Namen die Werte. Würde alles stark vereinfachen. Quasi ein Array in einem Array, ob PHP Maps mittlerweile kann weiß ich nicht.
Dann bist du auch in der Ausgabe sehr viel flexibler.
 
ok lag nur nur daran dass der <i> tag nicht beendet wird wenn ich 11 zeichen entferne...
 
Du kannst auch erst mal deine Daten vorverarbeiten, so dass dein Code übersichtlicher wird. Und schau dir mal an, was isset und unset machen. So wie du das einsetzt, wirkt es, als ob du es nicht verstanden hast.
PHP:
<?php
//$sql = 'SELECT * FROM Game WHERE friends = "abc" ORDER BY punktzahl DESC';
//foreach($pdo->query($sql) as $row)

//da ich die DB nicht hab, deklariere ich hier einfach ein Array mit passenden Daten
$testArray=
[
  [ "nutzername" => "Spieler 1",
    "punktzahl" => 4,],
  [ "nutzername" => "Spieler 2",
    "punktzahl" => 4,],
  [ "nutzername" => "Spieler 3",
    "punktzahl" => 4,],
  [ "nutzername" => "Spieler 4",
    "punktzahl" => 2,],
  [ "nutzername" => "Spieler 5",
    "punktzahl" => 2,],
 [ "nutzername" => "Spieler 6",
    "punktzahl" => 0,],

];

$letzePunkte = 'init';
$i=0;

foreach($testArray as $row)
{
    $displayname = $row['nutzername'];
    $punkte = $row['punktzahl'];

    if ($letzePunkte === "init" || $letzePunkte != $punkte)
    {
        $tempArray[$i++] =  [ "nutzername" => $displayname,
                              "punktzahl"  => $punkte,];
    }
    else
    {
        $tempArray[$i-1]["nutzername"] .= ' &amp; '.$displayname;
    }
    $letzePunkte = $punkte;
}
$medaillenZaehlung=0;
$ergebnis='';
foreach($tempArray as $row)
{
    $displayname = $row['nutzername'];

    $medaillenZaehlung++;
    $medaille = '';
    if($medaillenZaehlung == 1)
    {
        $medaille = '🥇 ';
    }
    elseif($medaillenZaehlung == 2)
    {
        $medaille = '🥈 ';
    }
    elseif($medaillenZaehlung == 3)
    {
        $medaille = '🥉 ';
    }
    $ergebnis .= '<br>'.$medaille.$displayname.': <u>'.$row['punktzahl'].'</u> Münzen';   
}

echo $ergebnis;
?>
 
Rankings gehen in die Datenbank. Schau mal bei MySQL oder wo bei den rankingfunktionen.
 
  • Gefällt mir
Reaktionen: mental.dIseASe
Zurück
Oben