Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Terminarz ligowy
Knight
post
Post #1





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 25.11.2012

Ostrzeżenie: (0%)
-----


Witam

Natrafiłem ostatnio znów na problem, tym razem nie mam pomysłu jak napisać terminarz ligi?

Otóż mam tabelę


Cytat
Ekstraklasa


a w niej kolumny

Cytat
numerID
Clubname


testowo stworzyłem 4 drużyny, jak zrobić żeby rozegrały one każda z każdą?

Cytat
1 kolejka
1 vs 2
3 vs 4

2 kolejka
1 vs 3
2 vs 4

3 kolejka

4 vs 1
2 vs 3


Nie mam pomysłu jak się do tego zabrać, byłbym wdzięczny za sugestie.



A chociaż mógłby ktoś pomóc z algorytmem?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Ech... No przecież nawet na forum istnieje skrypt jak to zrobić. By było weselej, to nawet dziś w nocy jeden z userów, bazując na takim temacie, zadał mi parę pytań na PW, bo czegoś w nim nie rozumiał, a ja wyjaśniałem jak algorytm losowania zrobić (IMG:style_emoticons/default/smile.gif) By nie być gołosłownym -> http://forum.php.pl/index.php?showtopic=144068 Patrz czytaj zrozum algorytm, porównaj ze stroną podaną w temacie i sam napisz własny (IMG:style_emoticons/default/smile.gif)

EDIT: Posłałem juz gotowca niemal na PW i rzuce go tutaj dla potomności i innych, zeby terminarza nie męczyli jako nowy temat co kilka dni na forum:
  1. // Tablica z nazwami drużyn
  2. $teams = array( 'Team1', 'Team2', 'Team3', 'Team4', 'Team5', 'Team6' );
  3. $rounds = array(); // Tu trzymamy zapis kolejki
  4. function matches($order, $teams) { // Dodatkowa funkcja, która nam z przeliczonej linii stworzy pary zespołów :)
  5. $round = array();
  6. $count = count($teams);
  7. for($i = 0, $len=$count/2; $i<$len; ++$i) {
  8. $round[] = array($teams[$order[$i]], $teams[$order[$count-$i-1]]);
  9. }
  10. return $round;
  11. }
  12. // Pierwsza kolejka jest banalna, bo to po prostu stworzenie par z istniejącej tabeli zespołów
  13. $rounds[] = array('order' => array_keys($teams), 'round' => matches(array_keys($teams), $teams));
  14. for ($i = 0, $len = count($teams)-2, $jump = ceil(count($teams)/2); $i<$len; ++$i ) {
  15. $line = $rounds[$i]['order']; // pobranie ostatniej linii sparowania zespołów
  16. for($curr = 0, $last = $len+1; $curr < $last; ++$curr ) {
  17. $line[$curr] += $jump; // dodanie niezmiennika ceil(n/2)
  18. if($line[$curr] > $len) {
  19. $line[$curr] -= $last; // jeśli za duży odjęcie (n-1)
  20. }
  21. }
  22. $rounds[] = array('order' => $line, 'round' => matches($line, $teams)); // zapis do rundy kolejności w kolejce i sparowania drużyn
  23. }
  24. var_dump($rounds); // wyświetlenie wyników


Czemu niemal? Bo to jest tylko dla parzystej liczby drużyn połowa kolejki. Dla nieparzystej zróbcie sobie sami (IMG:style_emoticons/default/biggrin.gif) A drugą połowę kolejki, bazując na temacie jaki podałem też sobie sami wyskrobcie (IMG:style_emoticons/default/wink.gif)

EDIT2: Jak widać... Jest to naprawdę prosta funkcja, z raptem 2 pętlami i if-em, oraz pomocniczą, która jedynie formatuje zapis kolejki. Równie dobrze mogłem formatowanie wyrzucić po prostu do osobnej pętli a zostawić tylko tworzenie zapisu drużyn w kolejce, co u mnie jest kluczem o nazwie 'order'. Nie musiałem tworzyć klucza 'round', gdyż on na tym etapie jest tylko po to, by pokazać spasowanie drużyn w meczu.
A na przyszłość MYŚLEĆ, skoro macie praktycznie gotowce na forum!!
Powód edycji: [thek]: Komentarz
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 10.10.2025 - 21:47