Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Terminarz ligowy
Forum PHP.pl > Forum > Przedszkole
Knight
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?
Damonsson
Pamiętaj o takich sprawach jak:

- rewanże,
- drużna ma mieć na zmianę mecz u siebie i na wyjeździe,
- nieparzysta ilość drużyn w lidze
- losowość terminarza

Co do skryptu, powodzenia i miłych godzin pracy wink.gif
zbychoCom
No i na przykład mecz zostaje odwołany/przeniesiony na inny termin z powodu zalanej murawy:)
aras785
if($gospodarz == $gosc) continue;
thek
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ć 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 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 biggrin.gif A drugą połowę kolejki, bazując na temacie jaki podałem też sobie sami wyskrobcie 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!!
Knight
Mimo wszystko nie mogę dojść jak przetworzyć te dane, próbowałem z pętlami foreach, ale wychodzą mi pary typu 3vs3, 4vs4 itp.

Wskazałby mi ktoś w jakim kierunku szukać rozwiązania?
sajegib
jak napisano wyżej

  1. if($gosc == $gospodarz) {
  2. continue;
  3. }


Czyli pomijasz iteracje pętli w momencie kiedy wylosuje ci np. 3vs3
zmienne $gosc i $gospodarz podane dla przykładu
Knight
kurde, faktycznie, nie zauważyłem tego posta O_o, mimo wszystko dzięki, wykminiłem coś takiego, nie wiem czy dobrze.

  1. foreach ($teams as $druzyna1 => $a) {
  2.  
  3.  
  4.  
  5. foreach ($teams as $druzyna2 => $b) {
  6.  
  7. if($a==$b)
  8. {
  9. continue;
  10. }
  11. echo '<p>'.$a . ' vs ' . $b . '</p>';
  12.  
  13.  
  14. }
  15. }



co daje mi rozpiskę praktycznie na dwie rundy

Cytat
Team1 vs Team2

Team1 vs Team3

Team1 vs Team4

Team1 vs Team5

Team1 vs Team6

Team2 vs Team1

Team2 vs Team3

Team2 vs Team4

Team2 vs Team5

Team2 vs Team6

Team3 vs Team1

Team3 vs Team2

Team3 vs Team4

Team3 vs Team5

Team3 vs Team6

Team4 vs Team1

Team4 vs Team2

Team4 vs Team3

Team4 vs Team5

Team4 vs Team6

Team5 vs Team1

Team5 vs Team2

Team5 vs Team3

Team5 vs Team4

Team5 vs Team6

Team6 vs Team1

Team6 vs Team2

Team6 vs Team3

Team6 vs Team4

Team6 vs Team5


chcący rozpisać to na kolejki próbowałem z $i i $i++ , lecz wtedy wychodzi że na np. w kolejce 1 gra 1vs2 i 2vs1, coś tu ja źle rozpisuje.

i jak, ma ktoś jakieś poprozycje?

czyli stoję w miejscu ;x
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.