Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Sortowanie tablic poprzez PHP
northwest
post
Post #1





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post
modern-web
post
Post #2





Grupa: Zarejestrowani
Postów: 763
Pomógł: 117
Dołączył: 15.03.2010
Skąd: void

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


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


--------------------
Pomogłem? Kliknij `Pomógł`. To nic nie kosztuje, a mnie usatysfakcjonuje! ;)
Go to the top of the page
+Quote Post
vokiel
post
Post #3





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


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


--------------------
Go to the top of the page
+Quote Post
northwest
post
Post #4





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post
vonski
post
Post #5





Grupa: Zarejestrowani
Postów: 292
Pomógł: 89
Dołączył: 27.12.2006
Skąd: Warszawa

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


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.


--------------------
Zend Certified Engineer | Microsoft Certified Professional: Programming in HTML5 with JavaScript & CSS3 | Blog
Go to the top of the page
+Quote Post
jasin
post
Post #6





Grupa: Zarejestrowani
Postów: 142
Pomógł: 32
Dołączył: 21.08.2008
Skąd: Toruń

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


  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

Ten post edytował jasin 28.03.2012, 21:06:20


--------------------
Go to the top of the page
+Quote Post
-north-
post
Post #7





Goście







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?
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: 21.08.2025 - 21:54