Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Sortowanie tablicy wielowymiarowej
Forum PHP.pl > Forum > Przedszkole
radamastix
Witam,

Mam problem i nie mogę znaleźć jego rozwiązania - wszystkie które znalazłem w internecie nie skutkują sad.gif

Mam na przykład taką tablice:

$wynik = array(

0 => array (
'typ' => 'a',
'level' => 4,
'progres' => 34
),

1 => array (
'typ' => 'b',
'level' => 4,
'progres' => 60
),

2 => array (
'typ' => 'c',
'level' => 7,
'progres' => 55
));



Chciałbym aby tablica była sortowana według LEVEL malejąco, czego nie udaje mi sie zrobić funkcją array_multisort np. w taki sposób:

foreach ($wynik as $row) {
foreach ($row as $key => $value){
${$level}[] = $value; //Creates $volume, $edition, $name and $type arrays.
}
}



array_multisort($level, SORT_ASC, $wynik);


Chciałbym również aby takie same levele były sortowane w środku tabeli według ich progresu , czyli według mojego przykładu najpierw byłby level = 7 , a następnie level 4 z poziomem 60, a później level 4 z poziomem 34. Jednak nie wiem czy to jest możliwe do zrobienia tą funkcją sort, więc według mojego zamysłu chcę najpierw posortować według levela, a później to sortowanie po progresie zrobie już może jakos pętla i IFami. Jeżeli ktoś ma jakiekolwiek sugestie jak rozwiązać ten problem bardzo proszę o jakąkolwiek pomoc. Z góry wielkie wielkie dzięki smile.gif

rad11
Moze się przyda:

  1. public function getOrder($array, $cols) {
  2. $colarr = array();
  3. foreach ($cols as $col => $order) {
  4. $colarr[$col] = array();
  5. foreach ($array as $k => $row) {
  6. $colarr[$col]['_' . $k] = strtolower($row[$col]);
  7. }
  8. }
  9. $eval = 'array_multisort(';
  10. foreach ($cols as $col => $order) {
  11. $eval .= '$colarr[\'' . $col . '\'],' . $order . ',';
  12. }
  13. $eval = substr($eval, 0, -1) . ');';
  14. eval($eval);
  15. $ret = array();
  16. foreach ($colarr as $col => $arr) {
  17. foreach ($arr as $k => $v) {
  18. $k = substr($k, 1);
  19. if (!isset($ret[$k]))
  20. $ret[$k] = $array[$k];
  21. $ret[$k][$col] = $array[$k][$col];
  22. }
  23. }
  24. return $ret;
  25. }
  26.  
  27. public function orderBy($name, $order) {
  28. $this->orderBy[] = array('name' => $name, 'order' => $order);
  29. return $this;
  30. }


  1. if (count($this->orderBy) > 0) {
  2.  
  3. $this->tData = $this->data;
  4. $this->data = array();
  5. $this->sorted = array();
  6.  
  7. foreach ($this->orderBy as $orderByIndex => $orderByValue) {
  8.  
  9. switch (strtolower($orderByValue['order'])):
  10. case "desc":
  11. $this->sorted[$orderByValue['name']] = SORT_DESC;
  12. break;
  13. case "asc":
  14. $this->sorted[$orderByValue['name']] = SORT_ASC;
  15. break;
  16. default :
  17. die("Order not exist {$orderByValue['order']}");
  18. break;
  19. endswitch;
  20. }
  21.  
  22. $this->data = array_values($this->getOrder($this->tData, $this->sorted));
  23. }

Z tego co pamietam sortowanie działa dla wielu kluczy czyli w twoim wypadku będzie według levelu a poten według progresu. Tylko musisz sobie przerobić na własne potrzeby ale jakby co to Ci pomogę.
Pyton_000
@up na ilość lecisz?

@autorze trzeba zacząć czytać ze zrozumieniem manual wink.gif

  1. <?php
  2.  
  3. $wynik = array(
  4.  
  5. 0 => array(
  6. 'typ' => 'a',
  7. 'level' => 4,
  8. 'progres' => 34,
  9. ),
  10.  
  11. 1 => array(
  12. 'typ' => 'b',
  13. 'level' => 4,
  14. 'progres' => 60,
  15. ),
  16.  
  17. 2 => array(
  18. 'typ' => 'c',
  19. 'level' => 7,
  20. 'progres' => 55,
  21. ),
  22. );
  23.  
  24. $levels = [];
  25. $progress = [];
  26.  
  27. foreach ($wynik as $key => $value) {
  28. $levels[$key] = $value['level'];
  29. $progress[$key] = $value['progres'];
  30. }
  31.  
  32. var_dump($wynik);
  33. array_multisort($levels, SORT_DESC, $progress, SORT_DESC, $wynik);
  34. var_dump($wynik);
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.