Når man begynder at få mange linjer i mange løkker er det et godt tegn på at man kan nedbryde koden i forskellige dele.
Vi vil arrange at alle hold skal spille med hinanden på kompatible datoer. Hvad er kompatible datoer? Det er datoer hvor to hold som skal spille mod hinanden ikke skal spille mod andre.
Vi kender datoerne holde 'kan' spille mod hinanden i $dates. Når vi begynder at arrange kampe så bliver datoerne 'brugt op'. Så lad os holde styr på hvilke datoer vi har arranget at hold skal spille mod hinanden.
Nu kan vi beskrive løsningen i pseudokode:
1. Udvælg to hold, A og B.
2. Gå alle datoer i gennem indtil vi finder en hvor begge hold er frie.
3. Arrange kampen på denne dato, og husk at begge hold nu er optagede denne dato.
Endelig kan vi overføre koden til PHP. Her er funktioner en god hjælp til at abstraktion.
$dateTeamPlaying holder styr på hvilke hold der spiller på en given dato. isPlaying fortæller om et hold allerede spiller på en bestemt dato. getDate bruger isPlaying til at finde en dato hvor begge hold er fri. arrangeMatch bruger getDate til at finde en dato og arrangerer så kampen på den dato.
Der er sikkert nogle syntaksfejl der skal rettes.
- $matches = array();
-
- //Remembers which teams play on a specific date.
- //E.g $dateTeamPlaying[$someDate] = array(teamX, teamY, teamZ, team...)
- $dateTeamPlaying = array();
-
- //Returns true if $team plays on $date
- function isPlaying($date, $team) {
- global $dateTeamPlaying;
- return array_key_exists($date, $dateTeamPlaying) && in_array($team, $dateTeamPlaying[$date]);
- }
-
- //Find a date for $teamA and $teamB where both are free to play against each other.
- //Assumes such a date exists.
- function getFreeDate($teamA, $teamB) {
- global $dates;
- foreach ($dates as $date) {
- if (!isPlaying($date, $teamA) && !isPlaying($date, $teamB)) {
- return $date;
- }
- }
- }
-
- //Find a date where $teamA can play against $teamB. Then arranges the match.
- function arrangeMatch($teamA, $teamB) {
- global $dateTeamPlaying, $matches;
- $matchDate = getFreeDate($teamA, $teamB);
- //Save it
- $dateTeamPlaying[$matchDate][] = $teamA;
- $dateTeamPlaying[$matchDate][] = $teamB;
- $matches[] = array(
- 'home' => $teamA->id,
- 'away' => $teamB->id,
- 'date' => $matchDate
- );
- }
-
- //Now lets arrange them all. You could bundle this up in a function arrangeAllMatches().
-
- foreach ($teams as $team_home) {
- foreach ($teams as $team_away) {
- if ($team_home === $team_away) continue;
- arrangeMatch($team_home, $team_away);
- }
- }
Eksempel (modificeret lidt):
http://sandbox.onlinephpfunctions.com/code/2aef1fb52b15d5c4fc610066ee23e761526b3dcaEDIT: Tilføjet 'global' til funktioner. Det er vidst nok nødvendigt her?
EDIT: getDate må eksisterer allerede, ændret til getFreeDate
Indlæg senest redigeret d. 09.11.2013 15:44 af Bruger #14645