![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 0 Dołączył: 5.03.2011 Ostrzeżenie: (0%) ![]() ![]() |
Otóż mam oto taki kod:
Co zrobić aby wynik był posortowany względem czasu od najkrótszego do najdłuższego? Obecnie skrypt zwraca wynik: L.P. Nick Marka Model Czas Tryb 1 MANIEK2512PL PAGANI ZONDA CINQUE 0:01:19.817 Singleplayer 2 JOERG1966 MCLAREN F1 0:01:13.800 Multiplayer 3 RYBECKI0902 PAGANI ZONDA CINQUE 0:01:23.075 Singleplayer 4 DELECTAMENTI PAGANI ZONDA CINQUE 0:01:12.861 Singleplayer 5 BLACKSHADOW849 PAGANI ZONDA CINQUE 0:01:21.805 Singleplayer |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 651 Pomógł: 116 Dołączył: 3.06.2012 Skąd: Lędziny Ostrzeżenie: (0%) ![]() ![]() |
Czas musisz mieć w formacie timestamp i wtedy nie ma problemu - order by time desc/asc.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 283 Pomógł: 31 Dołączył: 10.01.2006 Skąd: Działoszyn Ostrzeżenie: (0%) ![]() ![]() |
W polu typu timestamp przechowujemy datę i czas, a tutaj masz coś, co wygląda jak np. czas wykonania okrążenia na jakichś wyścigach
![]() -------------------- Po prawie 3-letniej przerwie w programowaniu, znowu raczkuję :) |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 0 Dołączył: 5.03.2011 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 36 Dołączył: 1.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
Pobierasz wyniki z dwóch tabel, następnie je porównujesz i tworzysz tabelkę. Jednym z rozwiązań będzie stworzenie tablicy dwuwymiarowej (zmienna $wynik), a następnie array_multisort.
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 283 Pomógł: 31 Dołączył: 10.01.2006 Skąd: Działoszyn Ostrzeżenie: (0%) ![]() ![]() |
Nie bardzo. Na Twoim miejscu czas ukończenia przechowywałbym w milisekundach w bazie, a dopiero potem (przy wyświetlaniu) konwertował na czas w Twoim formacie.
Funkcja znaleziona na StackOverflow:
Ten post edytował Michasko 27.01.2013, 16:00:24 -------------------- Po prawie 3-letniej przerwie w programowaniu, znowu raczkuję :) |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 0 Dołączył: 5.03.2011 Ostrzeżenie: (0%) ![]() ![]() |
Nie bardzo. Na Twoim miejscu czas ukończenia przechowywałbym w milisekundach w bazie, a dopiero potem (przy wyświetlaniu) konwertował na czas w Twoim formacie. Funkcja znaleziona na StackOverflow:
Ten sposób odpada ponieważ przy update tabeli musiałbym konwertować czas na milisekundy, a następnie jeszcze raz je konwertować tak jak napisałeś. Spróbuję sposobu z tablicą dwuwymiarową. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 36 Dołączył: 1.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
Ten sposób jest bardzo dobry i wskazany jeżeli chodzi o przechowywanie danych. No ale w ogóle nie rozwiązuje problemu z posortowanie wybranych rekordów 2 tabel.
Pobierasz, porównujesz, wybierasz jeden rekord, następnie zapisujesz do zmiennej, pętla leci dalej i dopisuje. Także stwórz tablicę, a następnie sortuj jej wyniki. No chyba, że ktoś ma inny pomysł - pamiętając, że nie można tutaj sortować danych po czasie. E: Tablicę wrzucasz oczywiście do pętli - przykład:
Następnie na niej operujesz. Ten post edytował kristaps 27.01.2013, 20:00:20 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 590 Pomógł: 107 Dołączył: 25.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
Po chwilowym zastanowieniu się dochodzę do wniosku, że dla wygenerowania topilsty 10 pozycji potrzebujemy:
1. Pobrać z bazy 10 najlepszych czasów z trybu singleplayer i zapisać do tablicy $top, jednocześnie dodając kolumnę "tryb" o wartości "singleplayer" 2. Pobrać z bazy 10 najlepszych czasów z trybu multiplayer i zapisać do tablicy $top, jednocześnie dodając kolumnę "tryb" o wartości "multiplayer" 3. posortować tablicę za pomocą uksort (polecam doczytać w manualu) 4. wyświetlić 10 pierwszych rekordów Koniec. A tak w ogóle, to dlaczego nie pomyślisz i nie zrzucisz całej roboty na bazę zamiast tak utrudniać sobie życie? Gdybyś wszystkie wyścigi miał w jednej tabeli, z dodatkowym polem "tryb", w którym miałbyś informację o tym, czy to było "single", czy "multi", to toplistę wyciągasz jednym zapytaniem ![]() Musisz tylko przeorganizować bazę - wszystkie wyniki wrzucić do JEDNEJ tabeli i dodać jedno pole - dokładnie to samo, co przedstawiłem w punktach 1 i 2. Oczywiście nie przeszkadza to w wyciąganiu N najlepszych wyników dla trybu np. singleplayer - załatawia to jedna klauzula "WHERE" w zapytaniu. P.S. CZASY DA SIĘ posortować - jeśli format się nie zmienia, to czas JEST sortowalny (klauzula "ORDER BY") |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 36 Dołączył: 1.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
Tak, jeżeli przeorganizuje bazę danych, to jest to najbardziej wykonalne. Pomagałem przy poprzednim temacie i mniej więcej wiem jak to wygląda. Maniek2512 porównuje czas graczy z X trasy, dla trybu single i multi. Załóżmy, że ma takie tabele:
Singleplayer trasa #21 (login, czas) Cytat MANIEK2512PL -02.00 JOERG1966-01.45 RYBECKI0902-02.02 BLACKSHADOW849-01.03 Multiplayer trasa #21 (login, czas) Cytat MANIEK2512PL -01.50 BLACKSHADOW849-00.99 W efekcie dla danej trasy (których jest załóżmy 20) nie wszyscy użytkownicy rozegrali oba tryby i otrzymamy: Cytat MANIEK2512PL -01.50 BLACKSHADOW849-00.99 JOERG1966-01.45 RYBECKI0902-02.02 Także wyciągnięcie top 10 nic nie da. Wyjściem jest właśnie tablica po porównaniu czasów z obu trybów rozgrywki dla danego gracza. Ten post edytował kristaps 27.01.2013, 20:55:19 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 590 Pomógł: 107 Dołączył: 25.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
Także wyciągnięcie top 10 nic nie da. Wyjściem jest właśnie tablica po porównaniu czasów z obu trybów rozgrywki dla danego gracza. A, ok - na Twoim przykładzie widać doskonale to, czego nie widać na przykładzie autora wątku. Zgadza się, nie jest to tabela najlepszych rezultatów na torze, tylko tabela najlepszych rezultatów graczy na torze. Jak dla mnie najlepiej przeorganizować bazę - będzie prościej w kodzie, a problem autora być może da się sprowadzić do jednej kwerendy bazy (ale tu już niech pomogą lepsi) |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 36 Dołączył: 1.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
To bodajże z NFS'da, ciekawe swoją drogą jak wygląda pobieranie wyników i aktualizowanie bazy w obu trybach (głównie single). Także trudno powiedzieć czy jest w ogóle możliwość przebudowy bazy - być może cały mechanizm na to nie pozwala. Jak Maniek zastosuje się do rady z tablicą w pętli to powinien bez problemu posegregować wyniki.
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 0 Dołączył: 5.03.2011 Ostrzeżenie: (0%) ![]() ![]() |
Napisałem coś takiego:
lecz mam problem z wyświetleniem danych. Tablica wygląda w ten sposób: Array ( [0] => Array ( [0] => 0:01:09.435 [1] => JOERG1966 [2] => MCLAREN [3] => F1 [4] => Singleplayer ) [1] => Array ( [0] => 0:01:12.861 [1] => DELECTAMENTI [2] => PAGANI [3] => ZONDA CINQUE [4] => Singleplayer ) [2] => Array ( [0] => 0:01:16.675 [1] => RYBECKI0902 [2] => PAGANI [3] => ZONDA CINQUE [4] => Multiplayer ) (...) ) Wiem, że trzeba je wyświetlić tak: itd. Lecz czy można to wstawić do tabeli tak jak miałem to wcześniej, czyli coś w tym stylu (+ ewentualnie jak to zrobić):
Ten post edytował maniek2512 28.01.2013, 02:02:17 |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 36 Dołączył: 1.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
Po pierwsze wyrzuć
z głównej pętli. Aktualnie sortujesz tablice z każdym wykonaniem pętli - a kompletna jest przecież dopiero po ostatnim pobraniu użytkownika z tabeli chicane. Otrzymujesz dobry wynik, ale zmniejszasz wydajność skryptu. Co do pytania, to żeby wyświetlić całą posortowaną tablicę, musisz użyć kolejnej pętli (poza główną pętlą). Tym razem bez gotowca (znam każdą linię Twojego skryptu ![]()
Tablica jest nieco inna, ale jak wyświetlisz wynik tego skryptu i porównasz z swoją to powinieneś zobaczyć zależność. Jak coś to pytaj ewentualnie doczytaj o foreach i tablicach dwuwymiarowych. Ten post edytował kristaps 28.01.2013, 02:44:15 |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 0 Dołączył: 5.03.2011 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki wielkie, zrobiłem tak i wszystko gra:
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 36 Dołączył: 1.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
Wykonujesz pętlę na tablicy, a później ją sortujesz. Zmień kolejność, najpierw array_multisort, później foreach. Edit: Chociaż jest ok, do tej pętli nie musisz chyba sortować tablicy. Ten post edytował kristaps 28.01.2013, 03:32:12 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 12:33 |