Ik zit met een probleem... Ik probeer het even uit te leggen:
Er zijn in een competitie 16 ploegen. Elk van deze ploegen moet elke week tegen één van de overige 15 ploegen spelen. Logischerwijs duurt dit dan 15 weken (want een ploeg speelt niet tegen zichzelf). Dit deel kan je beschouwen als de thuiswedstrijden. Maar hier komen ook de wedstrijden op verplaatsing bij. Nog eens 15 weken. In het totaal dus 30 weken. Het komt erop neer dat (als voorbeeld) bij ploegen A, B en C de volgende wedstrijden horen:
A - B
A - C
B - A
B - C
C - A
C - B
Maar dit dan voor meer ploegen... Ik probeer een script te schrijven dat dit voor eender't welk aantal ploegen kan genereren. Achteraf worden de waarden gewoon weggeschreven naar de database.
Regels?
- Elke week kan een ploeg maar 1 wedstrijd spelen. (8 wedstrijden per week in het totaal over alle ploegen, in het voorbeeld van 16 ploegen)
- Een ploeg mag maar 1 keer tegen elke andere ploeg spelen gedurende de eerste 15 weken (15 weken in het voorbeeld van 16 ploegen natuurlijk)
Wat bij een oneven aantal ploegen?
Dan wordt er gewoon een extra ploeg "vrij" toegevoegd, wat er dan op duidt dat de tegenstander die week geen wedstrijd hoeft te spelen.
Probeersel 1
Ik had iets uitgedacht dat als volgt zou werken: (de cijfers stellen ploegen voor)
1 - 16
2 - 15
3 - 14
...
8 - 9
Je ziet hierin een rechthoek. De ploegen links spelen tegen de ploegen rechts. Na het opslaan van de wedstrijden, zou elk element doorgeschoven worden volgens de richting van de klok. Maar dan sla je telkens een getal over... Je moet het maar eens een paar keer proberen.. Hier zie je de situatie na de eerste doorschuifbeurt:
2 - 1
3 - 16
4 - 15
...
9 - 10
De code hiervoor, was:
<?php
$array = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16); // ploegen
if(count($array)%2 != 0){ //dan is het oneven
array_push($array,'Vrij');
}
function schuifDoor(&$array){
$loopvoorwaarde = (count($array)-1);
$tmp = $array[0];
for($k=0; $k < $loopvoorwaarde; $k++){
$array[$k] = $array[$k+1];
}
$array[count($array)-1] = $tmp;
}
for($i = 1; $i <= (2*count($array)); $i++){ // voor het totaal aantal weken (30)
for($j=1; $j <= (count($array)/2); $j++){ // voor het aantal wedstrijden per week (8)
$ploeg1 = $array[$j-1]; // 0 1
$ploeg2 = $array[count($array)-$j]; // 15 14
echo 'Week '.$i.' '.$ploeg1.' ' .$ploeg2.'<br>';
}
echo '<br>';
schuifDoor($array);
}?>Probeersel 2
Ik dacht, ik neem 2 random van elkaar verschillende ploegen uit die reeks van 16 ploegen. Dan kijk ik na of die al in de database staan. Ik kijk of ze eerder (in een andere week) al tegen elkaar gespeeld hebben. Is dit niet zo, kunnen ze deze week tegen elkaar spelen. Dan kijk ik of ze in deze week al voorkomen in een andere wedstrijd. Als dat niet het geval is, kunnen ze tegen elkaar spelen.
Het lijkt een goed idee, maar dat is het niet. De code loopt goed tot ongeveer 2 à 3 weken. Het probleem is dat binnenin een week, bij de laatste wedstrijd, er nog 2 ploegen over zijn die met elkaar kunnen worden gekoppeld. Maar als deze ploegen in het verleden al tegen elkaar hebben gespeeld, gaat het script niet door. Daar blijft de loop verder draaien en krijg ik time-out omdat er toch geen andere oplossing is.
Dit is de code hiervoor:
<?php
include('../../config.php');
$array = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16); // ploegen
for($i = 1; $i <= (2*(count($array)-1)); $i++){
if($i <= 15){ // heenwedstrijden (ik ga er hier van uit dat het er 15 zijn, volgens het voorbeeld van 16 ploegen)
do{
do{
$ploeg1 = $array[rand(0,(count($array)-1))]; // kies random ploeg
do{
$ploeg2 = $array[rand(1,(count($array)-1))]; // kies random ploeg
}while($ploeg1 == $ploeg2); // zolang ploeg2 gelijk is aan ploeg 1
//check in database of één van deze ploegen deze week al speelt.
//... WAAR (p1 of p2 deze week al spelen) OF (p1 en p2 al tegen elkaar spelen)
$checkdb = mysql_query("
SELECT *
FROM edc_wedstrijden WHERE ((ploeg1=".$ploeg1." OR ploeg2=".$ploeg1." OR ploeg1=".$ploeg2." OR ploeg2=".$ploeg2.") AND week=".$i.") OR ((ploeg1=".$ploeg1." AND ploeg2=".$ploeg2.") OR (ploeg1=".$ploeg2." AND ploeg2=".$ploeg1."))") or die(mysql_error());
}while(mysql_num_rows($checkdb) != 0); // zolang het resultaat niet nul is, blijven we twee ploegen zoeken.
//als we twee ploegen gevonden hebben, voegen we ze hier toe.
mysql_query("INSERT INTO edc_wedstrijden SET week=".$i.", ploeg1=".$ploeg1.", ploeg2=".$ploeg2."");
//tel aantal wedstrijden
$countdb = mysql_num_rows(mysql_query("SELECT * FROM edc_wedstrijden WHERE week=".$i.""));
}while($countdb != (count($array)/2)); // zolang aantal wedstrijden niet gelijk is aan de helft van aantal ploegen (zodat iedereen dus speelt)
}elseif($i <= 30){ // terugwedstrijden
do{
do{
$ploeg1 = $array[rand(0,(count($array)-1))]; // kies random ploeg
do{
$ploeg2 = $array[rand(1,(count($array)-1))];// kies random ploeg
}while($ploeg1 == $ploeg2); // zolang ploeg2 gelijk is aan ploeg 1
//check in database of één van deze ploegen deze week al speelt.
//... WAAR (p1 of p2 deze week al spelen) OF (p1 en p2 al TWEE KEER tegen elkaar spelen)
$checkdb = mysql_query("SELECT * FROM edc_wedstrijden WHERE ((ploeg1=".$ploeg1." OR ploeg2=".$ploeg1." OR ploeg1=".$ploeg2." OR ploeg2=".$ploeg2.") AND week=".$i.") OR ((ploeg1=".$ploeg1." AND ploeg2=".$ploeg2.") AND (ploeg1=".$ploeg2." AND ploeg2=".$ploeg1."))") or die(mysql_error());
}while(mysql_num_rows($checkdb) != 0); // zolang het resultaat niet nul is, blijven we twee ploegen zoeken.
//als we twee ploegen gevonden hebben, voegen we ze hier toe.
mysql_query("INSERT INTO edc_wedstrijden SET week=".$i.", ploeg1=".$ploeg1.", ploeg2=".$ploeg2."");
//tel aantal wedstrijden
$countdb = mysql_num_rows(mysql_query("SELECT * FROM edc_wedstrijden WHERE week=".$i.""));
}while($countdb != (count($array)/2)); // zolang aantal wedstrijden niet gelijk is aan de helft van aantal ploegen (zodat iedereen dus speelt)
}
}?>Dit krijg je dan in de database te zien:

Hier is het duidelijk dat de enige overblijvende waarden in week 2: 1 en 3 zijn. ploegen 1 en 3 speelden in week 1 al tegen elkaar. Daarom werkt dit script dus niet.
Wie kan me verder helpen? Vindt iemand hier misschien een bestaand script voor? Ik vond niets.
Vriendelijke groeten
Ruben