Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Array_multisort
Forum PHP.pl > Forum > Przedszkole
MateuszS
Witam, mam problem z posortowaniem tablicy wielowymiarowej. Z racji dość nietypowego rozmieszczenia argumentów ciężko mi zrozumieć zasadę działania tej funkcji i nie bardzo mi wychodzi. Myślę na przykładzie lepiej bym zrozumiał. Chcę posortować np. taką tablicę wg "silnik". Chcę aby tablica była posortowana wg pojemności rosnąco

  1. $auto = array(
  2. "fiat" => array(
  3. "silnik" => 2000,
  4. "typ" => "TDI"
  5. ),
  6. "volvo" => array(
  7. "silnik" => 1500,
  8. "typ" => "LPG"
  9. ),
  10. "bmw" => array(
  11. "silnik" => 2500,
  12. "typ" => "TDI"
  13. )
  14. );


czyli najpierw musi być VOLVO, potem FIAT i na końcu BMW

PS ale chcialbym móc też elastycznie zmieniać wg czego chcę sortować, bo np mogę chcieć sortować po markach czy typie silnika i tu poległem
erix
Tobie jest raczej potrzebne usort. Masz w przykładach podobny przypadek do Twojego.
bastard13
Do czegoś takiego służy funkcja uksort:
  1. <?php
  2. $auto = array("fiat" => array("silnik" => 2000,"typ"=> "TDI"),
  3. "volvo" => array("silnik" => 1500,"typ"=> "LPG"),
  4. "bmw" => array("silnik" => 2500,"typ"=> "TDI"));
  5.  
  6. //to jest twoja funkcja porównująca, jeżeli bedziesz musiał porównywać po czym innym niż silnik to zmień watośc $var
  7. function cmp($a, $b)
  8. { $var='silnik';
  9. if ($a[$var] == $b[$var]) {
  10. return 0;
  11. }
  12. return ($a[$var] < $b[$var]) ? -1 : 1;
  13. }
  14.  
  15. //funkcja sortująca z wykożystaniem własnej funkcji, zachowuje klucze
  16. uksort($auto, "cmp");
  17.  
  18. foreach ($auto as $key => $value) {
  19. echo "$key:";
  20. print_r($value);
  21. echo '<br />';
  22. }
  23. ?>
MateuszS
Ale twój przykład bastard13 nie działa gdy chcę posortować nie wg liczby a np marki, wtedy nie działa. Bo mam trochę inną strukturę tablicy teraz, może coś źle przerobiłem


Kod
tu posortowane wg pojemnosci twoja funkcja
Array ( [3] => Array ( [0] => ) [2] => Array ( [0] => audi [1] => a4 [2] => Gaz [3] => 3000 [4] => ii [5] => Aa [6] => )
[1] => Array ( [0] => Merol [1] => SSKlasse [2] => Benzyna [3] => 3500 [4] => ok [5] => Aa [6] => ) [0] => Array ( [0] => Fiat [1] => 125p [2] => Diesel [3] => 2500 [4] => ok [5] => Aa [6] => ) )
bastard13
A jak wygląda teraz struktura tablicy? Bo na tej tablicy co dałeś w pierwszym poście sprawdzałem i działało.
MateuszS
Dałem strukturę tablicy w poście powyżej, ona jest generowana skryptem z pliku więc nie mam jak ci pokazać,

w pliku dane są przechowywane po ";"

  1. // $data to tablica która zawiera kolejne linijki pliku 0=>pierwsza 1=>druga itd
  2. foreach($data as $value) {
  3. $car = explode(";", $value);
  4. $auto[] = $car;
  5. }
bastard13
Jeżeli $auto nie jest tablicą asocjacyjną to skorzystaj z funkcji usort() zamiast uksort(). I zamiast stringa do zmiennej $var w funkcji cmp() wpisz wartośc odpowiedniego wiersza, po którym ma być sortowana tablica np. $var=3, gdy po pojemności silnika.
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.