Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie polaczonych tablic wedlug daty
Forum PHP.pl > Forum > PHP
hamlecik
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?
Jojo
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.
hamlecik
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
Jojo
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 ].
hamlecik
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. ?>
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.