Auslesen von Werten aus SQL-DB & Kombination per Zufallsprinzip

Wirklich seltsam ... genau das gleiche ... ist die tabelle vllt. doch irgendwie kaputt? mh

oder mein mysql? ... mhm
 
Zuletzt bearbeitet:
BONG - bin ich blind.
In der ersten Klammer müssen alle ' weg!
SQL:
INSERT INTO spieltage (spieltag, saisonid, ligaid, hteam, ateam) VALUES ('1','1','1','Eintracht Frankfurt','Schalke 04'), ....
 
Zuletzt bearbeitet von einem Moderator:
Oh man .... :-) Ja jetzt trägt er es ein.

ABER ... Was soll ich sagen. Auch wenns nervt :-( ... Er hat trotzdem doppelte Spiele?!

Also tatsächlich sind noch immer doppelte Spiele in der DB .... mh
 
Zuletzt bearbeitet:
PHP:
<?php

include("connect.inc.php");

/**
 * Funktion um den Cach-Wert eines Matches zu generieren
 * @param $hteam    String  Name des Heimteams
 * @param $ateam    String  Name des Auswertsteams
 * @return          String  Cach-Wert team###team
 */
function createMatchCachEntry($hteam,$ateam){
    return MIN($hteam,$ateam).'###'.MAX($ateam,$hteam);
}

//Settings
$saisonid = 1;
$ligaid = 1;
$anzSpielTage = 7;
$anzSpielePerTag = 4;

//Array mit allen Teams erstellen
$sql = "select * from team where ligaid = {$ligaid}";
$result = mysql_query($sql);
while($team = mysql_fetch_array($result)){
    $teams[] = $team['vereinsname'];
}

//Cach für alle Matches, damit kein Match 2 mal vorkommt
$cachMatches = array();
//Jeden Spieltag durchgehen
for($spieltag = 1; $spieltag <= $anzSpielTage; $spieltag++){
    //Teams neu mischen
    shuffle($teams);
    //Eine Kopie der Teams anlegen (array_shift() nimmt jeweils ein Eintrag aus dem Array heraus, 
    //ergo die Kopie wird immer kleiner
    $teamsCopy = $teams;
    
    //$anzSpielePerTag oder weniger Spiele (wenn zu wenig Manschaften vorhanden sind) aussuchen
    for($i=0; $i < min($anzSpielePerTag, floor(count($teams)/2)); $i++){
        //Schleife ohne Bedinung starten
        do{
            $hteam = array_shift($teamsCopy);
            $ateam = array_shift($teamsCopy);
            //Falls der Match bereits im Cach ist...
            if(in_array(createMatchCachEntry($hteam,$ateam), $cachMatches)){
                //.. die 2 Teams wieder zurückgeben und alles kräftig schütteln
                array_push($teamsCopy, $hteam, $ateam);
                shuffle($teams);
            }else{
                //Wenn der Match noch nicht im Cach ist
                //Schleife verlassen
                break;
            }
        } while(0);
        //Den Match fürs SQL vorbereiten
        $matchSqls[] = "($spieltag,$saisonid,$ligaid,'{$hteam}','{$ateam}')";
        //Den Match in den Cach laden
        $cachMatches[] = createMatchCachEntry($hteam,$ateam);
    }
}
//Die Matches mit einem einzigen DB-Zugriff eintragen
$sql = "INSERT INTO spieltage (spieltag,saisonid,ligaid,hteam,ateam) VALUES ".implode(',', $matchSqls);
mysql_query($sql) or die(mysql_error());
 
Zuletzt bearbeitet:
Ist also genau dein Code ... nur, dass ich die Werte für Spieltage geändert habe ... und meine include für die mysql db ... sonst ist alles original.
 
Erneuerter und besserer Ansatz. Anstelle von auswürfeln und schauen ob die Kombination schion besteht, ist es einfacher zuerst alle Kombinationen erstellen und dann diese in der Reihenfolge zu mischen

PHP:
//Array mit allen Teams erstellen
$sql = "select * from team where ligaid = {$ligaid}";
$result = mysql_query($sql);
while($team = mysql_fetch_array($result)){
    $teams[] = $team['vereinsname'];
}

/**
 * Funktion um den Cach-Wert eines Matches zu generieren
 * @param $hteam    String  Name des Heimteams
 * @param $ateam    String  Name des Auswertsteams
 * @return          String  Cach-Wert team###team
 */
function createMatchCachEntry($team1,$team2){
    return MIN($team1,$team2).'###'.MAX($team1,$team2);
}

//alle möglichen Matches definieren
$cachMatches = array();
$matches = array();
foreach($teams as $team1){
    foreach($teams as $team2){
        //Prüfen dass die Manschaft nicht gegen sich selber spielt und dass der Match noch nicht exisitiert
        if($team1 != $team2 && !in_array(createMatchCachEntry($team1,$team2), $cachMatches)){
            $cachMatches[] = createMatchCachEntry($team1,$team2);
            $matches[] = array($team1, $team2);
        }
    }
}

//Jeden Spieltag durchgehen
for($spieltag = 1; $spieltag <= $anzSpielTage; $spieltag++){
    //Die Matchs mischen
    shuffle($matches);
    //Anazahl Spiele pro Tag oder Anzahl üpbrige Matches durchgehen
    for($i=0; $i < min($anzSpielePerTag, count($matches)); $i++){
        //Den obersten Match aus der Leiste nehmen und aus der Liste entfernen
        $match = array_shift($matches);
        //Mischen wer die Heimmanschaft ist
        shuffle($match);
        //SQL-Insert-Teil zusammensetzen
        $matchSqls[] = "('{$spieltag}','{$saisonid}','{$ligaid}','{$match[0]}','{$match[1]}')";
    }
    if(count($matches)==0){ break; }
}
//Die Matches mit einem einzigen DB-Zugriff eintragen
$sql = "INSERT INTO spieltage (spieltag,saisonid,ligaid,hteam,ateam) VALUES ".implode(',', $matchSqls);
mysql_query($sql);
 
Zurück