Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Sortowanie tablicy wielowymiarowej
kszychu
post
Post #1





Grupa: Przyjaciele php.pl
Postów: 2 712
Pomógł: 23
Dołączył: 27.10.2003
Skąd: z kontowni

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


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ć.


--------------------
"Coś się kończy, coś się zaczyna." Andrzej Sapkowski
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
tiraeth
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 789
Pomógł: 41
Dołączył: 30.10.2003
Skąd: Wrocław

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


array_multisort" title="Zobacz w manualu php" target="_manual
Go to the top of the page
+Quote Post
mike
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


@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.
Go to the top of the page
+Quote Post
kszychu
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 2 712
Pomógł: 23
Dołączył: 27.10.2003
Skąd: z kontowni

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


@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


--------------------
"Coś się kończy, coś się zaczyna." Andrzej Sapkowski
Go to the top of the page
+Quote Post
FiDO
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

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


Mozna tez prosciej, za pomoca usort" title="Zobacz w manualu php" target="_manual, bez zaprzegania calej klasy do "glupiego" sortowania.


--------------------
Brak czasu :/
Go to the top of the page
+Quote Post
kszychu
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 2 712
Pomógł: 23
Dołączył: 27.10.2003
Skąd: z kontowni

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


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.


--------------------
"Coś się kończy, coś się zaczyna." Andrzej Sapkowski
Go to the top of the page
+Quote Post
FiDO
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

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


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.


--------------------
Brak czasu :/
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: 19.08.2025 - 14:52