Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Sortowanie polaczonych tablic wedlug daty
hamlecik
post
Post #1





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 31.07.2003

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


Witam,

Mam problem, z ktorym nie moge sobie poradzic. Problem wyglada nastepujaco:

Pobieram z bazy danych z dwoch roznych tabel po 10 wierszy (z kazdej tabeli) i potem za pomoca funkcji array_merge lacze oba wyniki w jedna tablice. print_r tablicy wyglada mniej wiecej tak:

Kod
Array
(
    [0] => Array
        (
            [0] => 1
            [id] => 1
            [2] => 20-10-2004
            [data] => 20-10-2004
        )

    [1] => Array
        (
            [0] => 2
            [id] => 2
            [2] => 21-10-2004
            [data] => 21-10-2004
            [3] => 2
            [jakies_pole] => 2
        )
}


Problem tkwi w tym, ze mam rozne daty i jesli wyswietle je bez sortowania wedlug daty to mam mniej wiecej taki wynik:

id | 21-10-2004
id | 31-10-2004
id | 11-11-2004

itp.

W jaki sposob moge posortowac ta tablice wedlug daty tak aby sie wyswietlane wyniki byly sortowane od najwczesniejszej daty do najstarszej?


--------------------

Yamaha YZF R1
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Jojo
post
Post #2





Grupa: Zarejestrowani
Postów: 405
Pomógł: 1
Dołączył: 19.09.2003
Skąd: Lublin

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


Zauważyłem, że daty, które podałeś są ułożone chronologicznie. Jeśli dzieje się tak w każdym przypadku, to wystarczy Ci funkcja array_reverse" title="Zobacz w manualu PHP" target="_manual.

Jeśli natomiast ułożone są one w "losowej" kolejności, to najlepiej będzie napisać własne sortowanie. Na przykład tak:
  1. <?php
  2. for( $i = 0; $i < count( $tablica ) - 1; $i++ )
  3. {
  4. $arrTime0 = explode( '-', $tablica[ $i ][ 'data' ] );
  5. $arrTime1 = explode( '-', $tablica[ $i + 1 ][ 'data' ] );
  6. $intTimestamp0 = mktime( 0, 0, 0, $arrTime0[ 0 ], $arrTime0[ 1 ], $arrTime0[ 2 ] );
  7. $intTimestamp1 = mktime( 0, 0, 0, $arrTime1[ 0 ], $arrTime1[ 1 ], $arrTime1[ 2 ] );
  8. if( $intTimestamp0 <= $intTimestamp1 )
  9. {
  10. $arrTemp = $tablica[ $i ];
  11. $tablica[ $i ] = $tablica[ $i + 1 ];
  12. $tablica[ $i + 1 ] = $arrTemp;
  13. }
  14. }
  15. ?>

Ten kawałek kodu można znacznie uprościć, gdybyś czas trzymał w formacie pozwalającym na łatwe porównywanie.
Ponadto dla dużych tablic możesz użyć szybszego algorytmu sortującego, ale to już zupełnie inna bajka.


--------------------
Rozwój cywilizacji informatycznej to wyścig między programistami, którzy wytwarzają coraz łatwiejsze
programy użytkowe dla idiotów, a światem produkującym coraz lepszych gatunkowo idiotów.

Blog: Małolepszy.info
Go to the top of the page
+Quote Post
hamlecik
post
Post #3





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 31.07.2003

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


Wielkie dzieki za funkcje Jojo ale chyba zapomnialem dodac jednego bardzo waznego elementu do mojego poprzedniego posta i dlatego funkcja sortujaca nie dziala tak jak powinna. Otoz chodzi o to, ze w pierwszej tablicy date mam np na "drugim miejscu" a w drugiej tablicy na "trzecim miejscu". Wkleje kod zeby bylo jasniej.

Kod
Array
(
    [0] => Array
        (
            [0] => 36
            [id] => 36
            [1] => 20-10-2004
            [data] => 20-10-2004
        )

    [1] => Array
        (
            [0] => 37
            [id] => 37
            [1] => 1
            [kid] => 1
            [2] => 20-10-2004
            [data] => 20-10-2004
        )
)


Sproboje sam przerobic funkcje ale jesli mi sie nie uda to sie odezwe winksmiley.jpg


--------------------

Yamaha YZF R1
Go to the top of the page
+Quote Post
Jojo
post
Post #4





Grupa: Zarejestrowani
Postów: 405
Pomógł: 1
Dołączył: 19.09.2003
Skąd: Lublin

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


Jeżeli masz tablicę indeksowaną ciągami znaków, to "miejsce" tej danej w tablicy nie ma najmniejszego znaczenia. Zauważ, że w moim kodzie odwołuję się do $tablica[0][ 'data' ], a nie $tablica[ 0 ][ 1 ].


--------------------
Rozwój cywilizacji informatycznej to wyścig między programistami, którzy wytwarzają coraz łatwiejsze
programy użytkowe dla idiotów, a światem produkującym coraz lepszych gatunkowo idiotów.

Blog: Małolepszy.info
Go to the top of the page
+Quote Post
hamlecik
post
Post #5





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 31.07.2003

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


Witam,

Odswiezam temat bo wkoncu zrobilem to sortowanie. Kod Jojo dal mi wiele pomocy aczkolwiek jest w nim blad. Chodzi o funkcje mktime, ktora powinna miec skladnie:

Cytat
mktime ( int godzina, int minuta, int sekunda, int miesiąc, int dzień, int rok [, int letni/zimowy])


a w kodzie sa zamienione miejscami dzien i miesiac.

Napisalem wkoncu troche wlasnego kodu, ktory dziala tak jak nalezy:

  1. <?php
  2. for( $i = 0; $i < count( $latest ); $i++ )
  3. {
  4. $arrTime0 = explode( '-', $latest[$i]['data'] );
  5. $intT = mktime( 0, 0, 0, $arrTime0['1'], $arrTime0['0'], $arrTime0['2'] );
  6.  
  7. $latest[$i]['time'] = $intT;
  8. }
  9.  
  10.  
  11. function csort( $a, $b ) 
  12. {
  13. return strnatcmp( $b['time'], $a['time'] );
  14. }
  15.  
  16. usort( $latest, &#092;"csort\" ); 
  17. ?>


--------------------

Yamaha YZF R1
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: 21.08.2025 - 23:12