Tilføj unik værdi til array hvor der er mindre end 2 matchende værdier

Tags:    php arrays array

Jeg er kommet i problemer igen.
Dette er en opfølger på en tidligere tråd, http://www.udvikleren.dk/forum/40467/match-array-op-som-sig-selv/


Det er et fodbold liga system hvor jeg planlægger hvem der skal spille mod hvem og hvornår.
Hvornår er problemet lige her, jeg har forsøgt at søge i $match, som er en array med arrays med alle kampe, efter hjemmehold, udehold, og kamp dato.
Hvis jeg kunne finde to eller flere match så måtte de jo betyde at en af holdene ikke kunne spille på den tid.

Her er koden:
Fold kodeboks ind/udPHP kode 

$dates er en array med nogle givne datoer som kampene kan forekomme på.

Eksempel på output:
Fold kodeboks ind/udKode 


F.eks. i array[18] og array[19], der er home og date den samme. Det er jo ikke meningen.



Indlæg senest redigeret d. 09.11.2013 14:30 af Bruger #16838
3 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato
Læg mærke til hvor mange gange følgende dato er med i output: '2013-11-10 19:00:00', jeg tæller 10 gange. Der er 5 hold, og siden to hold spiller mod hinanden kan der maks være 2 kampe på et tidspunkt og et hold sidder over. Der er 5*4 = 20 kampe og med maks 2 kampe på et tidspunkt skal der bruges minimum 10 tidspunkter (10 er også det optimale i dette tilfælde). Men jeg tæller kun 8 forskellige tidspunkter i dit eksempel.

Det kan hjælpe os med at besvare hvorfor denne dato blev valgt. Hvis din kode ikke finder en en gyldig dato vil løkken stadig afsluttes, men den sidste dato i $dates vil lægge i $date og du opretter kampen på denne. Mit gæt er at den sidste dato i din $dates er '2013-11-10 19:00:00'.

Så for at løse det problem skal du have nogle flere tidspunkter (dates).

Et andet problem er hvis du allerede planlagt A vs. B lad os sige på tidspunkt D1. Så du har planlagt kampen (A,B,D1). Når du så skal planlægge B vs A så vil den lave en array f.eks. (B,A,D2). Hvis du kører array_intersect på dette vil det give tallet 2, fordi A og B optræder i begge og du sætter statement til false, selvom det er på en anden dato. Derfor vil den blot køre igennem alle datoer og prøve men aldrig lykkes, og til sidst ende med at oprette kampen med den sidste dato den forsøgte. Dette forklarer hvorfor vi får lige præcis den sidste dato 10 gange.



Indlæg senest redigeret d. 09.11.2013 17:58 af Bruger #14645
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.

Fold kodeboks ind/udPHP kode 


Eksempel (modificeret lidt): http://sandbox.onlinephpfunctions.com/code/2aef1fb52b15d5c4fc610066ee23e761526b3dca

EDIT: 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
Er ikke så glad for at dele det op i funktioner.
Men den løsning du har der ville jeg mene at det er præcis det samme jeg gør.

Fold kodeboks ind/udPHP kode 




t