2009-08-04 4 views
3

Ich habe ein Array von einer unbekannten Länge die immer eine teilbare Menge von Werten haben, zum Beispiel:ein Spiel Zeitplan mit PHP erstellen _ schwieriger als ich dachte

print_r($initialarray); 

Array ([0] => 30 [1] => 31 [2] => 32 [3] => 33 [4] => 34 [5] => 35) 

Ich brauche Sets zu erstellen :

Set 1: 30 v 35; 31 v 34; 32 v 33; 

Set 2: 30 v 34; 31 v 33; 32 v 35; 

Set 3: 30 v 33; 31 v 32; 34 v 35; 

Set 4: 30 v 32; 33 v 34; 31 v 35; 

Set 5: 30 v 31; 32 v 34; 33 v 35; 

Die Reihenfolge der Werte dividieren durch v, um anzuzeigen, dass es sich um einen Satz handelt. Die Reihenfolge der Werte im Set spielt keine Rolle (das habe ich zufällig aus meinem Kopf zusammengefügt). Wie Sie sehen können, kann es in keinem anderen Satz oder innerhalb desselben Satzes doppelte Sätze geben.

Ich habe viele verschiedene Dinge ausprobiert, um etwas zu finden, das funktioniert. Der nächstgelegene ich bekommen habe anzog die Anfangswerte in einer überlappenden Anordnung alle möglichen gültigen matchups enthalten:

Array ([0] => Array ([0] => 35 [1] => 31) [1] => Array ([0] => 34 [1] => 31) [2] => Array ([0] => 33 [1] => 31) [3] => Array ([0] => 32 [1] => 31)) 

Array ([0] => Array ([0] => 35 [1] => 32) [1] => Array ([0] => 34 [1] => 32) [2] => Array ([0] => 33 [1] => 32)) 

Array ([0] => Array ([0] => 35 [1] => 33) [1] => Array ([0] => 34 [1] => 33)) 

Array ([0] => Array ([0] => 35 [1] => 34)) 

Diese Werte-Arrays sind in einem Array $ Sched genannt. ich links 30 aus dem Array .. oops

Die Zahlen sind Teams. Jedes Team muss jedes Team einmal spielen. Der Zeitplan wird so festgelegt, dass jede Mannschaft nur ein Spiel pro Woche spielt. Der Zeitplan muss über mehrere Wochen festgelegt werden, damit alle Spiele gespielt werden können, ohne dass ein Team mehr als einmal pro Woche spielt.

Ich habe bereits eine Permutationsfunktion verwendet und das ist, wie ich Array darüber kam, die nicht identische Übereinstimmungen hat. Ich muss jetzt herausfinden, wie man den Zeitplan ausgibt, wie in den Sets oben gezeigt. (Unter Berücksichtigung der Tatsache, dass die Reihenfolge des Beispiel in ist nicht so lange egal, wie kein Team zweimal in der gleichen Serie spielt)

$count = count($initialarray); 
$recount = $count -1; 
for($u=0; $u < $count;$u++){ 
    for($d=0;$d<$recount;$d++){ 
     $vs[$u][$d] = $sched[$d][$u]; 
    } 
$recount -= 1; 
} 

so dass nicht funktioniert, ich verkompliziert dies über das, was es sein sollte und ich kann meinen Kopf nicht mehr um das Thema wickeln. Jede Hilfe, auch wenn es von vorn beginnt, wird sehr geschätzt!

Antwort

0

Sie könnten ein Array mit jedem „Spiel“ in ihm bauen, so ist es etw wie

0 => 30 v 35 
1 => 31 v 34 
2 => 32 v 33 

Das ist ganz einfach sein sollte. Dann gehst du einfach durch dieses Array und legst das Spiel in die erste Reihe, in der noch keines der Teams spielt. Es könnte bessere und schnellere Lösungen geben, aber dies ist die erste, die mir in den Sinn kam, und ich denke, es ist ziemlich einfach zu schreiben.

1

Vielleicht löst dieser Code Ihr Problem, es ist nicht so elegant wie es sein könnte, aber es scheint zu funktionieren. Sie sollten ho arrangeGames funktioniert;)

Vielleicht müssen Sie auf arrangePlayerforDays achten. Die verschiedenen Spiele werden nur an einem Tag gespielt, wenn beide Spieler an diesem Tag noch kein Spiel haben. Die andere Funktion sind nur für den Code besser lesbar zu machen (und ein Paar von Pannen in arrangePlayerforDays cover)

function gamePrettyPrint($gamesOnADay, $glue) { 
    $result=array(); 
    foreach ($gamesOnADay as $currentGame) 
     $result[]=join($glue,$currentGame); 
    return $result; 
} 

function arrangeGamesOnAday($day) { 
    $result=array(); 
    for ($k=0, $limit=count($day); $k<$limit; $k+=2) 
     $result[]=array($day[$k+1], $day[$k]); 
    return $result; 
} 

function arrangeGames($players) { 
    for ($i=0, $limit=count($players); $i < $limit; $i++) 
    for ($j=$i+1; $j<$limit;$j++) 
     $games[]=array($players[$i], $players[$j]); 
    return $games; 
} 

function calculateTournamentDuration($players) { 
    return count($players)-1; // (n!)/(2!*(n-2)!) * (1/n) 
} 

function arrangePlayerforDays($games, $days) { 
    $mem = array_pad(array(),$tournamentDays,array()); 
    for ($k=0;count($games);$k++) 
    if ((array_search($games[0][0],$mem[$k%$days])=== false) and 
     (array_search($games[0][1],$mem[$k%$days])=== false)) 
     list($mem[$k%$days][], $mem[$k%$days][]) = array_shift($games); 
    return ($mem); 
} 

function scatterGamesOnCalendar($games, $tournamentDays) { 
    $days=arrangePlayerforDays($games, $tournamentDays); 
    $calendar=array_map('arrangeGamesOnAday',$days); 
    return $calendar; 
} 

// $initialArray = array('a','b','c','d','e','f','g','h'); 
$initialArray = array(30,31,32,33,34,35); 

$games= arrangeGames($initialArray); 
$tournamentSpan = calculateTournamentDuration($initialArray); 
$calendar = scatterGamesOnCalendar($games, $tournamentSpan); 

while ($day=array_shift($calendar)) 
    $prettyCalendar[]=gamePrettyPrint($day,' v '); 

print_r($prettyCalendar); 
0

Hat this Frage die Antwort haben Sie wollen?

0
$team = array(1 => 30 , 2 => 31 , 3 => 32 , 4 => 33 , 5 => 34 , 6 => 35); 

$numplayers = count($team); 
if ($numplayers % 2 != 0) $numplayers++; 
for ($round = 0;$round < $numplayers - 1;$round++) { 
    echo 'Set ' . ($round+1) . ":\n\n{$team[1]}-"; 
    for ($i = 0;$i < $numplayers-1;$i++) { 
     if ($i % 2 == 0) { 
      $player = ($numplayers-2) - ($i/2) - $round; 
     } else { 
      $player = ((($i-1)/2) - $round); 
     } 
     if ($player < 0) $player += $numplayers - 1; 
     echo $team[$player+2]; 
     echo ($i % 2 == 0) ? "\n" : '-'; 
    } 
    echo "\n\n<br/>"; 
} 
Verwandte Themen