Bernd: Spielerliste - zufällige Paarungen erzeugen

Hallo,

ich habe für unseren Verein eine Tabelle in MySQL mit den Spielernamen.
Diese Daten zeilenweise abzurufen habe ich hinbekommen(mit nem Beispiel aus dem Netz).

$z=mysql_query("SELECT id,spielername FROM turnier");
while($spieler=mysql_fetch_array($z))
{
if (empty($spieler[spielername])){
//do nothing
}else{
echo "$spieler[id] - $spieler[spielername] <br>";
}
}

Die Prüfung zwecks leeren Spielername ist nötig, da in der Tabelle auch reale Daten stehen und nicht jeder Spieler seinen "Spielernamen" eingetragen hat.

Ich möchte jedoch gern zufällige Spielerpaarungen erzeugen. Soll heißen: Wer spielt gegen wen?

Mit welchen Themen oder Funktionen sollte ich mich beschäftigen? Habt ihr evtl. ein paar, für den Laien verständliche. Ansätze oder Lösungen?

Vielen Dank.

  1. Die Prüfung zwecks leeren Spielername ist nötig, da in der Tabelle auch reale Daten stehen und nicht jeder Spieler seinen "Spielernamen" eingetragen hat.

    geht auch mit
    $z=mysql_query("SELECT id,spielername FROM turnier WHERE spielername!=''");

    Es gibt eine Funktion mit der du ein Zufalls Index Array erzeugst
    http://de.php.net/function.array-rand

    danach kannst du einfach durchgehen:

    for(i=0;i<count(Array);i+=2){
    Array[i] gegen Array[i+1]
    }

    1. Hallo,

      Es gibt eine Funktion mit der du ein Zufalls Index Array erzeugst
      http://de.php.net/function.array-rand

      danach kannst du einfach durchgehen:

      for(i=0;i<count(Array);i+=2){
      Array[i] gegen Array[i+1]
      }

      Vielen Dank für Deine Antwort. Irgend etwas habe ich noch missverstanden und mache es falsch.

      Ich habe jetzt diesen Code "zusammengebastelt":

      $z=mysql_query("SELECT id,spielername FROM turnier WHERE spielername!=''"); //Nur Spieler mit hinterlegtem Namen auswählen
      while($spieler=mysql_fetch_array($z))
      {

      }
      $paare = array_rand($spieler, 2);
      for(i=0;i<count($paare);i+=2){
      echo $paare[i]." gegen ".$paare[i+1];
      }

      Passieren tut nichts. Was mache ich falsch?

      Vielen Dank

      1. Probiere es mal so:

        Ich habe jetzt diesen Code "zusammengebastelt":

        $z=mysql_query("SELECT id,spielername FROM turnier WHERE spielername!=''"); //Nur Spieler mit hinterlegtem Namen auswählen
        while($spieler=mysql_fetch_array($z))
        {

        }

        $paare = array_rand($spieler,count($spieler));
        for($i=0;$i<count($paare);$i+=2){
        echo $spieler[$paare[$i]]." gegen ".$spieler[$paare[$i+1]];
        }

        1. Probiere es mal so:

          »» Ich habe jetzt diesen Code "zusammengebastelt":
          »»

          $spieler=array();

          »» $z=mysql_query("SELECT id,spielername FROM turnier WHERE spielername!=''"); //Nur Spieler mit hinterlegtem Namen auswählen

          while($spieler[]=mysql_fetch_array($z))

          »» {
          »»
          »» }

          $paare = array_rand($spieler,count($spieler));
          for($i=0;$i<count($paare);$i+=2){
          echo $spieler[$paare[$i]]." gegen ".$spieler[$paare[$i+1]];

          }

          1. Hallo,

            » »» Probiere es mal so:

            »»
            »» »» Ich habe jetzt diesen Code "zusammengebastelt":
            »» »»

            $spieler=array();

            »» »» $z=mysql_query("SELECT id,spielername FROM turnier WHERE spielername!=''"); //Nur Spieler mit hinterlegtem Namen auswählen

            while($spieler[]=mysql_fetch_array($z))

            »» »» {
            »» »»
            »» »» }
            »»
            $paare = array_rand($spieler,count($spieler));
            for($i=0;$i<count($paare);$i+=2){
            echo $spieler[$paare[$i]]." gegen ".$spieler[$paare[$i+1]];
            »» }
            »»

            Das sieht soweit gut aus. Zumindest hab ich jetzt keine weiße Seite mehr ;)
            Aber ich erhalte als Ausgabe:

            Array gegen ArrayArray gegen Array gegen ArrayArray gegen ArrayArray gegen ArrayArray gegen ArrayArray gegen ArrayArray gegen Array

            Liegt das an dem

            $spieler=array();

            ?

            Vielen Dank

            1. jo klar du hast jetzt ein array der datenbank zeile
              du willst warscheinlich
              $spieler[$paare[$i]]["spielername"]

              1. Hallo,

                jo klar du hast jetzt ein array der datenbank zeile
                du willst warscheinlich
                $spieler[$paare[$i]]["spielername"]

                Ja genau. Ich wusste nicht, das ich so darauf zugreifen muss.
                Hast Du evtl. eine Idee, wie ich das mit dem Spieler machen kann, der bei ungerader Zahl übrig bleibt?

                Vielen dank erstmal für Deine bisherige Hilfe und natürlich auch Danke an die anderen Antwortgeber.

  2. echo $begrüßung;

    Ich möchte jedoch gern zufällige Spielerpaarungen erzeugen. Soll heißen: Wer spielt gegen wen?

    "Sortiere" die Ergebnismenge nach Zufall (ORDER BY RAND()) und limitiere sie auf 2 (LIMIT 2).

    echo "$verabschiedung $name";

    1. Hallo,

      »» Ich möchte jedoch gern zufällige Spielerpaarungen erzeugen. Soll heißen: Wer spielt gegen wen?

      "Sortiere" die Ergebnismenge nach Zufall (ORDER BY RAND()) und limitiere sie auf 2 (LIMIT 2).

      Es sind aber mehr als zwei Spieler vorgesehen und ich brauch die Werte später fest. So hätte ich bei jedem Durchgang wieder neue Pärchen.

      Oder?

      Grüße

      1. echo $begrüßung;

        » »» Ich möchte jedoch gern zufällige Spielerpaarungen erzeugen. Soll heißen: Wer spielt gegen wen?
        » "Sortiere" die Ergebnismenge nach Zufall (ORDER BY RAND()) und limitiere sie auf 2 (LIMIT 2).
        Es sind aber mehr als zwei Spieler vorgesehen und ich brauch die Werte später fest. So hätte ich bei jedem Durchgang wieder neue Pärchen.

        Dazu kannst du die so ermittelten zwei Spieler (oder deren IDs) in eine Aufstellung der Paare übernehmen.

        echo "$verabschiedung $name";

      2. Hello,

        »» Ich möchte jedoch gern zufällige Spielerpaarungen erzeugen. Soll heißen: Wer spielt gegen wen?

        "Sortiere" die Ergebnismenge nach Zufall (ORDER BY RAND()) und limitiere sie auf 2 (LIMIT 2).

        Es sind aber mehr als zwei Spieler vorgesehen und ich brauch die Werte später fest. So hätte ich bei jedem Durchgang wieder neue Pärchen.

        Ja.
        Und außerdem musst Du doch auch sicherstellen, dass die bereits gepaarten nicht nochmals gepaart werden.

        Ich würde das anders machen: Eine weitere Tabelle bereitstellen für die Ziehungen

        id  ziehung id_spieler
        1      1     22
        2      1     11
        3      1     1
        4      1     25
        5      1     40
        6      1     13
        7      2     11
        8      2     33
        .      .

        Diese Tabelle fütterst Du mit einer Abfrage aus der anderen mit

        ... Order by rand() limit $geradezahl

        je nachdem, wieviele Paare Du aus der Gesamtmenge bilden willst.

        Und nachher spilt dann immer

        $offset+1 mit $offset+2
          $offset+3 mit $offset+4
          $offset+5 mit $offset+6

        wobei $offset der Aufsetzpunkt in den IDs der Ziehungstabelle ist, also für di erste Ziehung 0, für die zweite Ziehung 7 usw.

        Das Paare anzeigen lässt sich dann durch eine weitere Abfrage mit self-join erledigen

        SO ist sichergestellt, dass die Ziehung dokumentiert ist und dass Du in einer Ziehung wirklich jeden Spieler-Datensatz nur einmal hast.

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de