Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [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
Damonsson
post
Post #2





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


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
Go to the top of the page
+Quote Post
zbychoCom
post
Post #3





Grupa: Zarejestrowani
Postów: 55
Pomógł: 9
Dołączył: 7.04.2011

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


No i na przykład mecz zostaje odwołany/przeniesiony na inny termin z powodu zalanej murawy:)
Go to the top of the page
+Quote Post
aras785
post
Post #4





Grupa: Zarejestrowani
Postów: 859
Pomógł: 177
Dołączył: 29.10.2009

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


if($gospodarz == $gosc) continue;
Go to the top of the page
+Quote Post
thek
post
Post #5





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ć 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!!
Powód edycji: [thek]: Komentarz


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Knight
post
Post #6





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

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


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?
Go to the top of the page
+Quote Post
sajegib
post
Post #7





Grupa: Zarejestrowani
Postów: 352
Pomógł: 59
Dołączył: 16.01.2013

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


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
Go to the top of the page
+Quote Post
Knight
post
Post #8





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

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


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
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 09:06