Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Sortowanie dwóch tablic wielowymiarowych
Forum PHP.pl > Forum > Przedszkole
pehaperowiec
Mam takie 2 tablice
Kod
Array
(
    [0] => Array
        (
            [id] => 7
            [topic] => sdds9990
            [news_short] => sdfd
            [date] => 2014-01-02 22:36:00
            [show_news] => 1
        )

    [1] => Array
        (
            [id] => 10
            [topic] => as
            [news_short] => asd
            [date] => 2014-01-07 15:26:09
            [show_news] => 0
        )

    [2] => Array
        (
            [id] => 11
            [topic] => aaa
            [news_short] => sd
            [date] => 2014-01-10 11:15:01
            [show_news] => 1
        )

)
Jak je posortować po polu date a następnie połączyć te dwie tabele w 1 by była posortowana względem daty?
YourFrog
http://wklej.to/i9CTx

Części z merge nie rozumiem bo ja tam widzę 1 tabelę z 3 tabelami w środku tongue.gif
pehaperowiec
Chyba się troszke nie zrozumieniliśmy:D więc jeszcze raz:D dla przykładu, mam 2 tablice
Kod
Array
(
    [0] => Array
        (
            [id] => 7
            [topic] => sdds9990
            [news_short] => sdfd
            [date] => 2014-01-02 22:36:00
            [show_news] => 1
        )

    [1] => Array
        (
            [id] => 10
            [topic] => as
            [news_short] => asd
            [date] => 2014-01-07 15:26:09
            [show_news] => 0
        )

    [2] => Array
        (
            [id] => 11
            [topic] => aaa
            [news_short] => sd
            [date] => 2014-01-10 11:15:01
            [show_news] => 1
        )

)
oraz
Kod
Array
(
    [0] => Array
        (
            [id] => 7
            [topic] => sdds9990
            [news_short] => sdfd
            [date] => 2014-01-05 22:36:00
            [show_news] => 1
        )

    [1] => Array
        (
            [id] => 10
            [topic] => as
            [news_short] => asd
            [date] => 2014-01-11 15:26:09
            [show_news] => 0
        )

    [2] => Array
        (
            [id] => 11
            [topic] => aaa
            [news_short] => sd
            [date] => 2014-01-20 11:15:01
            [show_news] => 1
        )

)
i chciałbym otrzymać:
Kod
Array
(
    [0] => Array
        (
            [id] => 7
            [topic] => sdds9990
            [news_short] => sdfd
            [date] => 2014-01-02 22:36:00
            [show_news] => 1
        )
        
    [1] => Array
        (
            [id] => 7
            [topic] => sdds9990
            [news_short] => sdfd
            [date] => 2014-01-05 22:36:00
            [show_news] => 1
        )

    [2] => Array
        (
            [id] => 10
            [topic] => as
            [news_short] => asd
            [date] => 2014-01-07 15:26:09
            [show_news] => 0
        )
    
    [3] => Array
        (
            [id] => 10
            [topic] => as
            [news_short] => asd
            [date] => 2014-01-11 15:26:09
            [show_news] => 0
        )

    [4] => Array
        (
            [id] => 11
            [topic] => aaa
            [news_short] => sd
            [date] => 2014-01-10 11:15:01
            [show_news] => 1
        )
        
    [5] => Array
        (
            [id] => 11
            [topic] => aaa
            [news_short] => sd
            [date] => 2014-01-20 11:15:01
            [show_news] => 1
        )

)
czyli połączone 2 tablice, która będzie posortowana względem daty wink.gif
Cytat
Części z merge nie rozumiem bo ja tam widzę 1 tabelę z 3 tabelami w środku tongue.gif
Możesz jasniej?biggrin.gif
YourFrog
http://wklej.to/EgiNJ

Mam nadzieję że teraz dobrze zrozumiałem tongue.gif

Chodziło mi oto że w php jest funkcja łącząca dowolną ilość tablic ze sobą nazwya się ona "array_merge" jednak ma jedną wadę / zaletę. Łącząc tablice stara się zachować przypisanie do kluczy co powoduje nadpisywanie się kluczy ze sobą. W przykładzie naskrobałem na szybko metodę robiącą to samo ale nie zachowującą przypisanie do kluczy. Po złączeniu tablic musisz wywołać metodę sortującą w naszym przypadku to funkcja bez nazwy przekazana jako parametr do uasort.


@Edit
http://wklej.to/5dtMf

Możesz jeszcze spróbować takiej funkcji na większe podobieństwo z array_merge jednak wydaje mi się gorsza w użyciu.
pehaperowiec
a jak tego użyć gdy mam 2 tablice? Bo chciałbym by z dwóch takich co podałem w przykładzie powstała 1 posortowana względem daty. Czy mógłbyś mi pomóc?
tomxx
Do sortowania użyj funkcji uasort.
  1. <?php
  2. function sortowanie($a, $b)
  3. {
  4. if($a["date"] > $b["date"]) return -1;
  5. return 1;
  6. }
  7.  
  8. $tablica[0] = array("id"=>7, "topic"=>sdds9990, "news_short"=>sdfd, "date"=>"2014-01-02 22:36:00", show_news=>1);
  9. /* ... itd. ... */
  10.  
  11. uasort($tablica, "sortowanie");
  12. ?>
pehaperowiec
Nie rozumiem... mógłbyś mi rozwinąc jak moge połaczyc te 2 tablice w 1 i posortowąć po dacie?
tomxx
  1. <?php
  2. #Dwie tablice, które chcesz połączyć w jedną
  3. $tablica1 = array(
  4. array("id"=>7, "topic"=>sdds9990, "news_short"=>sdfd, "date"=>"2014-01-02 22:36:00", show_news=>1),
  5. /* ... */
  6. )
  7.  
  8. $tablica2 = array(
  9. array("id"=7, /* ... */),
  10. /* ... */
  11. )
  12.  
  13. #Pętla łącząca tablice (zmienna $tablica to będzie połączona tablica)
  14. for($i = 0; $i < count($tablica1); $i++) {
  15. $tablica[] = $tablica1[$i];
  16. $tablica[] = $tablica2[$i];
  17. }
  18.  
  19. #Funkcja sortująca tablicę wg daty
  20. function sortowanie($a, $b)
  21. {
  22. if($a["date"] > $b["date"]) return -1;
  23. return 1;
  24. }
  25.  
  26. #Teraz sortowanie tablicy:
  27. uasort($tablica, "sortowanie");
  28. ?>
Oczywiście jeśli masz PHP 5 >= 5.4, to możesz używać [ ... ] dla tablic.
pehaperowiec
No zgadza się, dostaje taki wynik:
Kod
Array
(
    [1] => Array
        (
            [id] => 4
            [gallery_name] => asd
            [date] => 2014-01-11 06:40:29
            [show_gallery] => 1
            [img_main] => b_adv.png
        )

    [6] => Array
        (
            [id] => 12
            [topic] => 1
            [news_short] => aa
            [date] => 2014-01-11 06:38:51
            [show_news] => 1
        )

    [3] => Array
        (
            [id] => 3
            [gallery_name] => 2
            [date] => 2014-01-10 14:48:41
            [show_gallery] => 1
            [img_main] => img.png
        )

    [5] => Array
        (
            [id] => 2
            [gallery_name] => 1
            [date] => 2014-01-10 14:35:50
            [show_gallery] => 1
            [img_main] => b_logo.png
        )

    [4] => Array
        (
            [id] => 11
            [topic] => aaa
            [news_short] => sd
            [date] => 2014-01-10 11:15:01
            [show_news] => 1
        )

    [2] => Array
        (
            [id] => 10
            [topic] => as
            [news_short] => asd
            [date] => 2014-01-07 15:26:09
            [show_news] => 0
        )

    [0] => Array
        (
            [id] => 7
            [topic] => sdds9990
            [news_short] => sdfd
            [date] => 2014-01-02 22:36:00
            [show_news] => 1
        )

)
Tylko jak teraz powyciągać dane w takiej kolejności:D indeksy nei są po kolei:D
tomxx
Indeksy nie są po kolei, ponieważ tablica jest posortowana wg daty (tak, jak wcześniej chciałeś).
Rozumiem jednak, że chcesz najpierw posortować obie tablice osobno, a potem połączyć.
W takim wypadku:
  1. <?php
  2. #Dwie tablice, które chcesz połączyć w jedną
  3. $tablica1 = array(
  4. array("id"=>7, "topic"=>sdds9990, "news_short"=>sdfd, "date"=>"2014-01-02 22:36:00", show_news=>1),
  5. /* ... */
  6. )
  7.  
  8. $tablica2 = array(
  9. array("id"=7, /* ... */),
  10. /* ... */
  11. )
  12. #Funkcja sortująca tablicę wg daty
  13. function sortowanie($a, $b)
  14. {
  15. if($a["date"] > $b["date"]) return -1;
  16. return 1;
  17. }
  18.  
  19. #Teraz sortowanie tablic:
  20. uasort($tablica1, "sortowanie");
  21. uasort($tablica2, "sortowanie");
  22.  
  23. #Pętla łącząca tablice (zmienna $tablica to będzie połączona tablica)
  24. for($i = 0; $i < count($tablica1); $i++) {
  25. $tablica[] = $tablica1[$i];
  26. $tablica[] = $tablica2[$i];
  27. }
  28.  
  29. ?>
Po prostu zamieniasz funkcje sortujące wstawiasz bezpośrednio po utworzeniu obu tablic.
IceManSpy
To Ci "zresetuje" indeksy tablicy:
http://php.net/manual/en/function.array-values.php
tomxx
uasort
uasort zachowuje skojarzenia kluczy
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.