Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Sortowanie tablic poprzez PHP
Forum PHP.pl > Forum > Przedszkole
northwest
Witam serdecznie,
Mam taką tablicę:
Array
(
[0] => 9.5|16|NAZWA|2219688|2012-03-01|1000|2005||LPG|6|2|3|4|6|40.00|10%|30.00|30.00|tak|30.00|1|0|0|0|0|10|0||0|
[1] => 8.15|26|NAZWA2|2219625|2012-03-01|1000|2005||LPG|6|1.8|2.7|3.6|5.4|36.00|10%|10.00|30.00|10.00|35.00|1|0|0|0|7|10|0||0|
[2] => 7.5|14|NAZWA3|2219663|2012-03-01|1000|2005||LPG|6|2|3|4|6|40.00|10%|30.00|30.00|tak|tak|1|0|0|0|0|10|0||0|
[3] => 7.15|27|NAZWA4|2219644|2012-03-01|1000|2005||LPG|6|2.2|3.3|4.4|6.6|40.00|10%|12.00|20.00|10.00|36.00|2|0|0|0|8|10|0||0|
[4] => 6.95|10|NAZWA5 |226442222|2012-03-01|1000|2005|0|LPG|6|1.4|2.1|2.8|4.2|24.00|10%|30.00|30.00|tak|nie|1|0|0|0|3|10|-1||0|
[5] => 6.7|23|NAZWA6|226444444|2012-03-01|1000|2005||LPG|6|2.4|3.6|4.8|7.2|40.00|10%|10.00|20.00|tak|25.00|2|0|-1|0|9|10|0||0|
[6] => 6.5|24|NAZWA7|229622, 2219661|2012-03-01|1000|2005||LPG|6|2|3|4|6|40.00|10%|15.00|20.00|tak|25.00|1|0|0|0|5|10|0||0|
[7] => 6.2|21|NAZWA8|2219191|0000-00-00|1000|2005||LPG|6|2.4|3.6|4.8|7.2|40.00|10.00%|tak|tak|tak|tak|2|0|-3|0|8|10|0||0|
[8] => 6.2|20|NAZWA9|226777777|2012-03-01|1000|2005||LPG|6|2.4|3.6|4.8|7.2|40.00|10.00%|10.00|20.00|tak|30.00|2|0|0|0|0|10|0||0|
[9] => 5.8|13|NAZWA10 |2219662|2012-03-01|1000|2005||LPG|6|1.6|2.4|3.2|4.8|32.00|10%|10.00|20.00|tak|20.00|1|0|0|0|4|10|0||0|
[10] => 4.7|18|NAZWA11 |229623, 2219628|2012-03-01|1000|2005||LPG|6|2.4|3.6|4.8|7.2|40.00|10%|15.00|20.00|tak|10.00|2|0|0|-3|0|10|0||0|
[11] => 4.65|15|NAZWA12 |2219668|2012-03-01|1000|2005||LPG|6|1.8|2.7|3.6|5.4|36.00|10%|tak|20.00|tak|tak|2|0|0|0|5|10|0||0|
[12] => 4.525|6|NAZWA13 |221005353|2012-03-01|1000|2005|0|LPG|6|1.3|1.95|2.6|3.9|24.00|10%|10.00|15.00|tak|tak|1|0|0|0|1|10|0||0|
[13] => 3.8|17|NAZWA14|26464646|2012-03-01|1000|2005||LPG|6|1.6|2.4|3.2|4.8|32.00|10%|tak|tak|tak|tak|1|0|0|0|6|10|0||0|
[14] => 3.85|9|NAZWA15|2219626|2012-03-01|1000|2005|0|LPG|6|2.2|3.3|4.4|6.6|40.00|10%|15.00|20.00|tak|nie|1|0|0|0|0|10|0||0|
[15] => 3.58|22|NAZWA16|2219669|2012-03-01|1000|2005||LPG|6|1.9|2.8|3.8|5.7|38.00|10%|tak|tak|tak|tak|1|0|0|1|0|10|0||0|
[16] => 3.48|25|NAZWA17|2219664|2012-03-01|1000|2005||LPG|6|2.2|3|4|6|40.00|10%|tak|tak|tak|tak|1|0|0|0|6|10|0||0|
[17] => 2.65|8|NAZWA18|2219459|2012-03-01|1000|2005|0|LPG|6|1.8|2.7|3.6|5.4|36.00|10%|tak|tak|tak|nie|1|0|0|0|2|10|0||0|
[18] => 10.7|19|NAZWA19|2219624|2012-03-01|1000|2005||LPG|6|2.4|3.6|4.8|7.2|40.00|10%|20.00|25.00|tak|30.00|1|0|-3|0|7|10|0||0|
[19] => 1.875|7|NAZWA20|2219667|2012-03-01|1000|2005|0|LPG|6|1.5|2.25|3|4.5|30.00|10%|tak|tak|tak|nie|1|2|1|0|0|10|0||0|
[20] => 1.7|11|NAZWA21|228111111|2012-03-01|1000|2005|0|LPG|6|2.4|3.6|4.8|7.2|40.00|10%|15.00|20.00|nie|nie|1|0|1|0|0|10|0||0|
[21] => -122|28|NAZWA22|tel|2000-03-01|1000|2005|postoje|LPG|111|222|333|444|555|postoj|rabat|77|88|99|tak|2|-14|-6|4|9|10|0|www|1|
)

Muszę przesortować te wartości po 5,4,3 i 2 ostatnich polach (czyli od końca odliczając po "|"). Wiecie może jak to zrobić?
Próbuję z tym już od 2 dni, ale już nie mam pomysłów sad.gif
modern-web
Rozdziel sobie każdy wers, skorzystaj z explode, posortuj?
Ja w tym nie widzę nic trudnego ale nie wiem na czym stoisz i chyba nie ma sensu żebym dyktował Ci to wszytko od 0.
Pokaż co masz, jaką masz koncepcję? smile.gif
vokiel
Rozbij każdy wiersz na dodatkowe tablice (zwykłe explode), wtedy będziesz mógł sortować po wybranej kolumnie tych tablic.
Kod
Array
(
[0] => Array
    (
     [0] => 9.5
     [1] => 16
     [2] => NAZWA
     itd..
northwest
noo tym explode to później rozbijam przy insertach/selectach itp wink.gif

tylko jak to wykorzystać przy sortowaniu? rozbicie tego nic nie da, bo to string - a php nie sortuje dobrze po stringach z tego co widzęsad.gif
vonski
Możesz skorzystać z usort i w funkcji sortującej użyć właśnie explode. Coś w ten deseń:

  1.  
  2. function mySort($a, $b)
  3. {
  4. $arr1 = explode('|', $a);
  5. $arr2 = explode('|', $b);
  6. $length = count($arr1);
  7.  
  8. if($arr1[$length - 5] == $arr2[$length - 5]) {
  9. if($arr1[$length - 4] == $arr2[$length - 4]) {
  10. if($arr1[$length - 3] == $arr2[$length - 3]) {
  11. if($arr1[$length - 2] == $arr2[$length - 2]) {
  12. return 0;
  13. } else {
  14. return $arr1[6] > $arr2[6] ? 1 : -1;
  15. }
  16. } else {
  17. return $arr1[5] > $arr2[5] ? 1 : -1;
  18. }
  19. } else {
  20. return $arr1[4] > $arr2[4] ? 1 : -1;
  21. }
  22. } else {
  23. return $arr1[3] > $arr2[3] ? 1 : -1;
  24. }
  25. }


Ta funkcja będzie traktować piąty element od końca jako nadrzędny, jeśli te elementy będą równe to porówna czwarty element od końca, potem trzeci itd. Coś w stylu ORDER BY w MySQL.
jasin
  1. function cmp($rowA, $rowB)
  2. {
  3. $tabA = explode('|', $rowA);
  4. $tabB = explode('|', $rowB);
  5.  
  6. // tu dajesz warunki jakie maja byc spelnione podczas sortowania np.
  7. $count = count($tabA);
  8.  
  9. if ($tabA[$count - 6] == $tabB[$count - 6])
  10. {
  11. return 0;
  12. }
  13.  
  14. if ($tabA[$count - 6] < $tabB[$count - 6])
  15. {
  16. return -1;
  17. }
  18.  
  19. return 1;
  20. }
  21.  
  22. // niech $tab będzie Twoją tablicą
  23. $tab = array
  24. (
  25. '0' => '9.5|16|NAZWA|2219688|2012-03-01|1000|2005||LPG|6|2|3|4|6|40.00|10%|30.00|30.00|tak|30.00|1|0|0|0|0|10|0||0|',
  26. // ...
  27. '21' => '-122|28|NAZWA22|tel|2000-03-01|1000|2005|postoje|LPG|111|222|333|444|555|postoj|rabat|77|88|99|tak|2|-14|-6|4|9|10|0|www|1|',
  28. );
  29.  
  30. usort($tab, "cmp");


Edit: Ktoś mnie ubiegł smile.gif
north
niestety nie pomogło:(

znalazłem taki kod:
  1. <?php
  2.  
  3. $tablica = array();
  4.  
  5. $tablica[0] = '9.5|16|NAZWA|2219688|2012-03-01|1000|2005||LPG|6|2|3|4|6|40.00|10%|30.00|30.00|tak|30.00|1|0|0|0|0|10|0||0|';
  6. $tablica[1] = '8.15|26|NAZWA2|2219625|2012-03-01|1000|2005||LPG|6|1.8|2.7|3.6|5.4|36.00|10%|10.00|30.00|10.00|35.00|1|0|0|0|7|10|0||0|';
  7. $tablica[2] = '7.5|14|NAZWA3|2219663|2012-03-01|1000|2005||LPG|6|2|3|4|6|40.00|10%|30.00|30.00|tak|tak|1|0|0|0|0|10|0||0|';
  8. $tablica[3] = '7.15|27|NAZWA4|2219644|2012-03-01|1000|2005||LPG|6|2.2|3.3|4.4|6.6|40.00|10%|12.00|20.00|10.00|36.00|2|0|0|0|8|10|0||0|';
  9. $tablica[4] = '6.95|10|NAZWA5 |226442222|2012-03-01|1000|2005|0|LPG|6|1.4|2.1|2.8|4.2|24.00|10%|30.00|30.00|tak|nie|1|0|0|0|3|10|-1||0|';
  10. $tablica[5] = '6.7|23|NAZWA6|226444444|2012-03-01|1000|2005||LPG|6|2.4|3.6|4.8|7.2|40.00|10%|10.00|20.00|tak|25.00|2|0|-1|0|9|10|0||0|';
  11. $tablica[6] = '6.5|24|NAZWA7|229622, 2219661|2012-03-01|1000|2005||LPG|6|2|3|4|6|40.00|10%|15.00|20.00|tak|25.00|1|0|0|0|5|10|0||0|';
  12. $tablica[7] = '6.2|21|NAZWA8|2219191|0000-00-00|1000|2005||LPG|6|2.4|3.6|4.8|7.2|40.00|10.00%|tak|tak|tak|tak|2|0|-3|0|8|10|0||0|';
  13. $tablica[8] = '6.2|20|NAZWA9|226777777|2012-03-01|1000|2005||LPG|6|2.4|3.6|4.8|7.2|40.00|10.00%|10.00|20.00|tak|30.00|2|0|0|0|0|10|0||0|';
  14. $tablica[9] = '5.8|13|NAZWA10 |2219662|2012-03-01|1000|2005||LPG|6|1.6|2.4|3.2|4.8|32.00|10%|10.00|20.00|tak|20.00|1|0|0|0|4|10|0||0|';
  15. $tablica[10] ='4.7|18|NAZWA11 |229623, 2219628|2012-03-01|1000|2005||LPG|6|2.4|3.6|4.8|7.2|40.00|10%|15.00|20.00|tak|10.00|2|0|0|-3|0|10|0||0|';
  16. $tablica[11] ='4.65|15|NAZWA12 |2219668|2012-03-01|1000|2005||LPG|6|1.8|2.7|3.6|5.4|36.00|10%|tak|20.00|tak|tak|2|0|0|0|5|10|0||0|';
  17. $tablica[12] ='4.525|6|NAZWA13 |221005353|2012-03-01|1000|2005|0|LPG|6|1.3|1.95|2.6|3.9|24.00|10%|10.00|15.00|tak|tak|1|0|0|0|1|10|0||0|';
  18. $tablica[13] ='3.8|17|NAZWA14|26464646|2012-03-01|1000|2005||LPG|6|1.6|2.4|3.2|4.8|32.00|10%|tak|tak|tak|tak|1|0|0|0|6|10|0||0|';
  19. $tablica[14] ='3.85|9|NAZWA15|2219626|2012-03-01|1000|2005|0|LPG|6|2.2|3.3|4.4|6.6|40.00|10%|15.00|20.00|tak|nie|1|0|0|0|0|10|0||0|';
  20. $tablica[15] = '3.58|22|NAZWA16|2219669|2012-03-01|1000|2005||LPG|6|1.9|2.8|3.8|5.7|38.00|10%|tak|tak|tak|tak|1|0|0|1|0|10|0||0|';
  21. $tablica[16] = '3.48|25|NAZWA17|2219664|2012-03-01|1000|2005||LPG|6|2.2|3|4|6|40.00|10%|tak|tak|tak|tak|1|0|0|0|6|10|0||0|';
  22. $tablica[17] = '2.65|8|NAZWA18|2219459|2012-03-01|1000|2005|0|LPG|6|1.8|2.7|3.6|5.4|36.00|10%|tak|tak|tak|nie|1|0|0|0|2|10|0||0|';
  23. $tablica[18] = '10.7|19|NAZWA19|2219624|2012-03-01|1000|2005||LPG|6|2.4|3.6|4.8|7.2|40.00|10%|20.00|25.00|tak|30.00|1|0|-3|0|7|10|0||0|';
  24. $tablica[19] = '1.875|7|NAZWA20|2219667|2012-03-01|1000|2005|0|LPG|6|1.5|2.25|3|4.5|30.00|10%|tak|tak|tak|nie|1|2|1|0|0|10|0||0|';
  25. $tablica[20] = '1.7|11|NAZWA21|228111111|2012-03-01|1000|2005|0|LPG|6|2.4|3.6|4.8|7.2|40.00|10%|15.00|20.00|nie|nie|1|0|1|0|0|10|0||0|';
  26. $tablica[21] = '-122|28|NAZWA22|tel|2000-03-01|1000|2005|postoje|LPG|111|222|333|444|555|postoj|rabat|77|88|99|tak|2|-14|-6|4|9|10|0|www|1|';
  27.  
  28. $tablica_sortowania = array();
  29.  
  30. foreach($tablica as $tresc)
  31. {
  32. $tablica_sortowania[] = explode("|",$tresc);
  33. }
  34.  
  35. echo "<pre>";
  36. print_r($tablica);
  37. echo "</pre>";
  38.  
  39. foreach($tablica_sortowania as $key => $row)
  40. {
  41. $five[$key] = strtotime($row[4]); // wartość z pola 5
  42. $four[$key] = $row[3]; // wartość z pola 4
  43. $three[$key] = $row[2]; // wartość z pola 3
  44. $two[$key] = $row[28]; // wartość z pola przed ostatniego
  45. $one[$key] = $row[29]; // wartość z pola ostatniego
  46. }
  47.  
  48. array_multisort($five, SORT_ASC, $four, SORT_ASC, $three, SORT_ASC, $two, SORT_ASC, $one, SORT_ASC, $tablica_sortowania);
  49.  
  50. $tablica = array();
  51.  
  52. foreach($tablica_sortowania as $row)
  53. {
  54. $tablica[] = implode("|",$row);
  55. }
  56.  
  57. echo "<pre>";
  58. print_r($tablica);
  59. echo "</pre>";
  60.  
  61. ?>


ten kod z multisort działa extra dla nazwy...

tylko w przypadku gdy mam:
$t1[$key] = $row[11];
array_multisort($t1, SORT_ASC, $tablica_sortowania);

to sortuje jakoś dziwnie: 1.30 , 2.40, 1.60, 1.80, 2.40, 2.00

Wiecie może dlaczego tak jest? dlaczego nie sortuje poprawnie?
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.