Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Sortowanie ligowej tableli
Forum PHP.pl > Forum > Przedszkole
chipoldo
Problem dotyczy sortowania piłkarskiej tabeli ligowej. Operacje przeprowadzane są na dwóch tabelach bazy MySQL:

tabela
`tabela_id` ,`druzyna_id`, `liga_id`, `mecze`, `punkty`, `wygrane`, `remisy`, `przegrane`, `strzelone`, `stracone`, `roznica`


wyniki
`wynik_id`, `liga_id`, `data`, `kolejka`, `druzyna_id_1`, `druzyna_id_2`, `wynik_1`, `wynik_2`

Problem polega na tym, że ustalanie tabeli jest w następujący sposób:

- punkty, różnica bramek, bramki strzelone z tabeli `tabela`

- Przy równej ilości punktów drużyn drugim kryterium sortowania nie jest różnica bramek, a bezpośredni mecz (mecze) między tymi drużynami. Zrobiłem sortowanie funkcją uasort z własną funkcją, którą zamieszczam poniżej, ale niestety działa ona tylko w przypadku równej ilości punktów dwóch drużyn. W przypadku równej ilości punktów 3  lub więcej drużyn trzeba brać pod uwagę tzw. "małą tabelkę", czyli sortowanie między tymi drużynami odbywa się w kolejności punkty, różnica bramek, bramki strzelone tylko w meczach między tymi drużynami. Funkcja, którą ja sortuje, w przypadku więcej niż dwóch drużyn błędnie wyznacza wynik sortowania

Kod tabeli:

CODE


for ($i = 0; $i < $ilosc_znalezionych; $i++)
{
   $wiersz = $wynik->fetch_assoc();

   $tablica[$i][1] = $wiersz['nazwa_druzyny'];
   $tablica[$i][2] = $wiersz['mecze'];
   $tablica[$i][3] = $wiersz['punkty'];
   $tablica[$i][4] = $wiersz['wygrane'];
   $tablica[$i][5] = $wiersz['remisy'];
   $tablica[$i][6] = $wiersz['przegrane'];
   $tablica[$i][7] = $wiersz['strzelone'];
   $tablica[$i][8] = $wiersz['stracone'];
   $tablica[$i][9] = $wiersz['roznica'];
   $tablica[$i][10] = $wiersz['druzyna_id'];
}


//funkcja sortowania
function sortowanie($a, $b)
{
   if ( $a[3] == $b[3] )
//sprawdzenie bezpośredniego pojedynku między zainteresowanymi druzynami
{
   $zapytanie = "SELECT * FROM `wyniki` WHERE (druzyna_id_1 = {$a[10]} and druzyna_id_2 = {$b[10]}) or (druzyna_id_1 = {$b[10]} and druzyna_id_2 = {$a[10]});";
   $wynik = wyslij_zapytanie($zapytanie);
   $ilosc_znalezionych = $wynik->num_rows;
   for ($i = 0; $i < $ilosc_znalezionych; $i++)
   {
     $wiersz = $wynik->fetch_assoc();
     $druzyna_id_1 = $wiersz['druzyna_id_1'];
     $druzyna_id_2 = $wiersz['druzyna_id_2'];
     $wynik_1 = $wiersz['wynik_1'];
     $wynik_2 = $wiersz['wynik_2'];
       if (($a[10] == $druzyna_id_1) and ($b[10] == $druzyna_id_2))
       {
        if ($wynik_1 > $wynik_2)
        {
          $punktyA += 3;
        }
        else if ($wynik_1 < $wynik_2)
     [php]   {
           $punktyB += 3;
        }
        $bramkiA += $wynik_1;
        $bramkiB += $wynik_2;
       }
      else if (($b[10] == $druzyna_id_1) and ($a[10] == $druzyna_id_2))
      {
       if ($wynik_1 > $wynik_2)
       {
         $punktyB += 3;
       }
         if ($wynik_1 < $wynik_2)    
       {
         $punktyA += 3;
       }
       $bramkiB += $wynik_1;
       $bramkiA += $wynik_2;
     }
   }
    if ($punktyA < $punktyB)
    {
     return 1;
     }
     else if (punktyA > $punktyB)
     {
      return -1;
     }
      else if ($punktyA == $punktyB)
     {
     if ($bramkiA < $bramkiB)
       {
       return 1;
        }
         if ($bramkiA > $bramkiB)
         {
          return -1;
         }
         if ($bramkiA == $bramkiB)
         {
         if ($a[9] < $b[9])
          {
           return 1;
         }
         else if ($a[9] > $b[9])
         {
          return -1;
          }
          else if ($a[9] == $b[9])
          {
            if ($a[7] < $b[7])
            {
             return 1;
            }
          else if ($a[7] > $b[7])
          {
            return -1;
          }
          else if ($a[7] == $b[7])
          {
             if ($a[1] < $b[1])
              {
               return -1;
              }
             else if ($a[1] > $b[1])
              {
               return 1;
              }
             else
             {
              return 0;
             }
           }
        }
     }
   }
}
else if ( $a[3] < $b[3] )
return 1;
else if ( $a[3] > $b[3] )
return -1;
}
usort($tablica, 'sortowanie')


muniekw
A nie możesz robić sortowania przy wyciąganiu z bazy?
chipoldo
Cytat(muniekw @ 26.02.2010, 11:25:40 ) *
A nie możesz robić sortowania przy wyciąganiu z bazy?

Niestety i z poziomu bazy sobie nie poradziłemz tym problemem. Nie jestem jakimś zaawansowanym programistą ale myślę, że to prędzej z poziomu PHP niż z MySQL da się zrobić. Bo niestety największy problem to zrobienie tej tzw. "małej tabelki", jakby tabeli w tabeli... Niestety nie mam pomysłu jak
muniekw
Sortowanie:

  1. SELECT nazwa_pola FROM nazwa_tabeli ORDER BY nazwa_pola [rodzaj_sortowania]


Możesz sortować wiele pól, odzielając je przecinkami.

Rodzaje sortowania:
ASC - sortowanie rosnąco, domyślny sposób sortowania
DESC - sortowanie malejąco
chipoldo
Takim sortowaniem to tego nie zrobisz. To nie jest zwykły problem sorotowania. Patrz:druzyna A 3
druzyna B 3
druzyna C 3

druzyna A wygrała 2-1 z B
druzyna B wygrała 3-1 z C
druzyna C wygrała 4-1 z A 

zwykłe sortowanie lub sortowanie w tablicy patrzac na następny wiersz zrobi z tego
druzyna B
druzyna C
druzyna A
ponieważ sprawdzi czy A wygrała z B a później wiersz drugi sprawdzi z C
a prawidłowe ustawienie powinno być
druzyna C bo ma najwiecej strzelonych przy równej ilości różnicy bramek z B
druzyna B
druzyna A...


więc normalne sortowanie tu nie pomoże

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.