Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie tablicy wielowymiarowej
Forum PHP.pl > Forum > PHP
kszychu
Szukałem w różnych miejscach ale albo nie potrafię szukać, albo nie ma tej informacji (podejrzewam jednak to pierwsze). Otóż mam taką tablicę:
Cytat
[2] => Array
        (
            [klient] => 76
            [sprawa] => 185
            [pracownik] => 1
            [czas] => 3
            [stawka] => 1142.8571428571
            [zysk] => 3428.5714285714
            [koszt] => 7894973.6842105
        )

    [3] => Array
        (
            [klient] => 93
            [sprawa] => 188
            [pracownik] => 1
            [czas] => 5.00
            [stawka] => 300
            [zysk] => 1500
            [koszt] => 13158789.473684
        )

    [4] => Array
        (
            [klient] => 76
            [sprawa] => 179
            [pracownik] => 26
            [czas] => 3
            [zysk] => 450
            [koszt] => 15000840
        )

To oczywiście jej fragment. Teraz chcę posortować tę tablicę względem pól pracownik, klient, sprawa jednocześnie. Sortowanie według jednego pola to nie problem, chodzi mi o taką funkcję, której można podać kilka elementów, po których ma sortować.
mike
@tiraeth doczytaj manuala tongue.gif
Cytat
array_multisort() może być użyta do sortowania kilku tablic na raz lub wielowymiarowej tablicy na podstawie jednego z większej liczby wymiarów. Zachowywane są przypisania kluczy.


@kszychu znalazłem to:
Class: Array Multi Sort (Sort arrays considering multiple values) na PHPClasses. Nie szukałem długo więc pewnie są jeszcze inne. Ale ta powinna spełnić Twoje oczekiwania.
kszychu
@mike_mech: masz u mnie krate piwa. To jest właśnie to, czego szukałem! Dzięki.


----edit----
Jo łelkam biggrin.gif
Niech się chłodzi smile.gif
~mike_mech
FiDO
Mozna tez prosciej, za pomoca usort" title="Zobacz w manualu php" target="_manual, bez zaprzegania calej klasy do "glupiego" sortowania.
kszychu
Cytat(FiDO @ 2005-10-20 09:10:46)
Mozna tez prosciej, za pomoca usort" title="Zobacz w manualu php" target="_manual, bez zaprzegania calej klasy do "glupiego" sortowania.

Że można, to ja się domyślam. Niestety nie wiem jak. Jeśli więc wiesz i zechcesz się tą wiedzą ze mną podzielić, to będę wdzięczny.
FiDO
Moze troszke sie zapedzilem.. w sumie lepiej obudowac to w klase, bo na samych funkcjach to trzeba by uzywac globali, ale da sie. Nie widzialem tamtego kodu, bo cos mi nie dziala strona logowania na phpclasses, ale podejrzewam ze klasa tamta robi troche wiecej, niz tylko to sortowanie przez co moze byc przerosnieta. I pewnie tez korzysta z usort'a.

Wersja skrocona takiego sortowania moglaby wygladac np. tak:

  1. <?php
  2.  
  3. class ArrayMultiSort
  4. {
  5. var $fields;
  6.  
  7. function _callback($a, $b, $i = 0)
  8. {
  9. if ($a[$this->fields[$i]] == $b[$this->fields[$i]]) {
  10. if (isset($this->fields[$i + 1])) {
  11. return $this->_callback($a, $b, $i + 1);
  12. }
  13. return 0;
  14. }
  15. return ($a[$this->fields[$i]] > $b[$this->fields[$i]])? 1 : -1;
  16. }
  17.  
  18. function sort(&$arr)
  19. {
  20. usort($arr, array(&$this, '_callback'));
  21. }
  22. }
  23.  
  24. var_dump($aTest);
  25.  
  26. $sort = new ArrayMultiSort;
  27. $sort->fields = array('pracownik', 'klient', 'sprawa');
  28. $sort->sort($aTest);
  29.  
  30. var_dump($aTest);
  31.  
  32. ?>

Oczywiscie brakuje ustalania kolejnosci itp., ale to jest wersja minimalistyczna, zeby nie zasmiecac kodu niepotrzebnymi bajerami, a byla tylko widoczna zasada dzialania.
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.