Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] sortowanie tablicy wielowymiarowej
Forum PHP.pl > Forum > Przedszkole
cezarek
Witajcie,
mam problem z posortowaniem tablicy wielowymiarowej. Ślęczę już nad tym cały dzień i dalej nic. Tyle co wyczytałem, to że powinienem użyć funkcji array_multisort, ale kompletnie nie potrafię tego ugryźć.
Oto moja tablica:
  1. $auta = Array(
  2. "Ford" => array("2003", "2.5", "142"),
  3. "BMW" => array("2005", "2.5", "197"),
  4. "Opel" => array("2001", "1.6", "113"),
  5. "Audi" => array("2004", "3.2", 214"),
  6. );

Tak ją wyświetlam:
  1. foreach ($auta as $marka => $dane)
  2. {
  3. echo "<li>$marka<br />&bull; rocznik: ".$dane[0]."<br />&bull; pojemność: ".$dane[1]."<br />&bull; moc: ".$dane[2]."</li>";
  4. }

Teraz chcę ją posortować według pojemności, ale nie wiem jak. Może ktoś mi podowiedzieć co wpisać w tym arrayu multisorcie, żeby zadziałało?

Pozdrawiam
Czarek
Pyton_000
Przecież przykład #3 z Manuala dokładnie jest tym czego chcesz.
YourFrog
Dodam od siebie żeby na przyszłość nie utrudniać sobie życia. Rozwiązanie obiektowe posiada mnóstwo dodatkowych atutów przy takich listach.

Struktura opisująca auta
  1. /**
  2.  * Struktura opisująca auto
  3.  * @author Paweł Stelmasiak <YourFrog>
  4.  */
  5. class Car
  6. {
  7. /**
  8. * Marka
  9. * @var string
  10. */
  11. protected $brand;
  12.  
  13. /**
  14. * Pojemność
  15. * @var float
  16. */
  17. protected $volume;
  18.  
  19. /**
  20. * Moc silnika
  21. * @var integer
  22. */
  23. protected $power;
  24.  
  25. /**
  26. * Rok produkcji
  27. * @var integer
  28. */
  29. protected $year;
  30.  
  31. /**
  32. * Konstruktor
  33. */
  34. public function __construct()
  35. {
  36. $this->brand = 'unknow';
  37. $this->year = 0;
  38. $this->volume = 0;
  39. $this->power = 0;
  40. }
  41.  
  42. //Setter
  43.  
  44. /**
  45. * Ustawia markę auta
  46. * @param string $brand
  47. */
  48. public function setBrand($brand)
  49. {
  50. $this->brand = $brand;
  51. }
  52.  
  53. /**
  54. * Ustawia pojemność auta
  55. * @param float
  56. */
  57. public function setVolume($volume)
  58. {
  59. $this->volume = $volume;
  60. }
  61.  
  62. /**
  63. * Ustawia moc auta
  64. * @param integer
  65. */
  66. public function setPower($power)
  67. {
  68. $this->power = $power;
  69. }
  70.  
  71. /**
  72. * Ustawia rok produkcji auta
  73. * @param integer
  74. */
  75. public function setYear($year)
  76. {
  77. $this->year = $year;
  78. }
  79.  
  80. //Getter
  81.  
  82. /**
  83. * Zwraca markę auta
  84. * @return string
  85. */
  86. public function getBrand()
  87. {
  88. return $this->brand;
  89. }
  90.  
  91. /**
  92. * Zwraca pojemność auta
  93. * @return float
  94. */
  95. public function getVolume()
  96. {
  97. return $this->volume;
  98. }
  99.  
  100. /**
  101. * Zwraca moc auta
  102. * @return integer
  103. */
  104. public function getPower()
  105. {
  106. return $this->power;
  107. }
  108.  
  109. /**
  110. * Zwraca rok produkcji auta
  111. * @return integer
  112. */
  113. public function getYear()
  114. {
  115. return $this->year;
  116. }
  117. }



Kolekcja obsługująca listę aut
  1. /**
  2.  * Klasa zarządzająca kolekcją aut
  3.  * @author Paweł Stelmasiak <YourFrog>
  4.  */
  5. class CarCollection extends \YourFrog\Library\ArrayObject
  6. {
  7. /**
  8. * Sortuje listę po pojemności aut
  9. */
  10. public function sortByVolume()
  11. {
  12. uasort($this->arr, function($a, $b){
  13.  
  14. if( $a->getVolume() == $b->getVolume() )
  15. return strcmp($a->getBrand(), $b->getBrand());
  16.  
  17. return $a->getVolume() < $b->getVolume();
  18. });
  19. }
  20. }


Główny kod w którym ustalasz sobie auta
  1. $manager = new CarCollection();
  2.  
  3. $car = new Car();
  4. $car->setBrand('Ford');
  5. $car->setYear(2003);
  6. $car->setVolume(2.5);
  7. $car->setPower(142);
  8. $manager->append($car);
  9.  
  10. $car = new Car();
  11. $car->setBrand('BMW');
  12. $car->setYear(2005);
  13. $car->setVolume(2.5);
  14. $car->setPower(197);
  15. $manager->append($car);
  16.  
  17. $car = new Car();
  18. $car->setBrand('Opel');
  19. $car->setYear(2001);
  20. $car->setVolume(1.6);
  21. $car->setPower(113);
  22. $manager->append($car);
  23.  
  24. $car = new Car();
  25. $car->setBrand('Audi');
  26. $car->setYear(2004);
  27. $car->setVolume(3.2);
  28. $car->setPower(214);
  29. $manager->append($car);
  30.  
  31. $manager->sortByVolume();



Gdzieś w pliku z widokiem wyświetlasz sobie auta
  1. $html = '';
  2. foreach($manager as $car)
  3. {
  4. $html .= '<li>
  5. <p>' . $car->getBrand() . '</p>
  6. <p>rocznik: ' . $car->getYear() . '</p>
  7. <p>pojemność: ' . $car->getVolume() . '</p>
  8. <p>moc: ' . $car->getPower() . '</p>
  9. </li>';
  10. }
  11.  
  12. echo $html;



Na końcu link do całego przykładu (znajduje się tam klasa ArrayObject i Arr).
http://www.speedyshare.com/d69Y4/test.zip
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.