Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] sortowanie tablicy
tomekohio
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 13.01.2004
Skąd: Ohio

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


Witam!
Mam pewien, na pozór mały problem. Otórz rzecz dotyczy sortowania. Chodzi o to aby wyświetlać pliki (graficzne) w kolejności od najstarszego do najmłodszego. Pliki te są uploadowane przez kamery IP. Chciałbym mieć możliwość wyświetlania zdjęć z zadanego przedziału czasowego w w/w kolejności.
bez tworzenia sortowania program zwraca pliki w następującej kolejności:
CODE

motion-2007-09-11-11-40-08.jpg
motion-2007-09-11-11-42-18.jpg
motion-2007-09-06-18-03-06.jpg
motion-2007-09-08-10-09-13.jpg
motion-2007-09-08-10-13-44.jpg
motion-2007-09-08-10-19-02.jpg
motion-2007-09-08-10-23-59.jpg
motion-2007-09-08-10-28-25.jpg
motion-2007-09-08-10-34-03.jpg
motion-2007-09-08-10-41-05.jpg
motion-2007-09-08-10-46-10.jpg
motion-2007-09-08-10-51-27.jpg
motion-2007-09-08-10-56-24.jpg
motion-2007-09-08-11-00-57.jpg
motion-2007-09-08-11-05-36.jpg
motion-2007-09-08-11-10-04.jpg
motion-2007-09-08-11-14-41.jpg
motion-2007-09-08-11-19-10.jpg
motion-2007-09-08-11-24-38.jpg
motion-2007-09-08-11-29-11.jpg
motion-2007-09-08-11-33-39.jpg
motion-2007-09-08-11-38-36.jpg
motion-2007-09-08-11-43-35.jpg
motion-2007-09-08-11-48-45.jpg
motion-2007-09-08-11-53-55.jpg
motion-2007-09-08-11-58-49.jpg
motion-2007-09-08-12-03-52.jpg
motion-2007-09-08-12-09-59.jpg
motion-2007-09-06-09-08-22.jpg
motion-2007-09-06-15-29-47.jpg
motion-2007-09-06-21-57-47.jpg
motion-2007-09-06-22-31-11.jpg
motion-2007-09-06-22-38-34.jpg
motion-2007-09-06-22-46-43.jpg
motion-2007-09-06-23-30-33.jpg
motion-2007-09-06-23-39-28.jpg
motion-2007-09-06-23-48-39.jpg
motion-2007-09-07-00-01-08.jpg
motion-2007-09-07-00-10-03.jpg
motion-2007-09-06-08-54-05.jpg
motion-2007-09-06-23-10-56.jpg
motion-2007-09-06-23-23-10.jpg
motion-2007-09-06-23-34-37.jpg
motion-2007-09-06-23-42-25.jpg
motion-2007-09-06-23-52-58.jpg
motion-2007-09-07-00-03-49.jpg
motion-2007-09-07-00-14-08.jpg
motion-2007-09-05-22-51-52.jpg
motion-2007-09-05-23-57-07.jpg
motion-2007-09-06-00-01-12.jpg
motion-2007-09-06-00-05-16.jpg
motion-2007-09-06-00-09-06.jpg
motion-2007-09-06-00-12-25.jpg
motion-2007-09-06-00-16-29.jpg
motion-2007-09-06-00-20-19.jpg
...
...
...

(skopiowałem tylko część ze względu na oszczędność miejsca na serwerze winksmiley.jpg to tak tylko żeby zobrazować jak to wygląda).
Po zastosowaniu funkcji natsort() pliki wyswietlają sie mniej wiecej w takiej kolejności:
CODE

motion-2007-09-11-11-40-08.jpg
motion-2007-09-11-11-42-18.jpg
motion-2007-09-06-18-03-06.jpg
motion-2007-09-08-10-09-13.jpg
motion-2007-09-08-10-13-44.jpg
motion-2007-09-08-11-24-38.jpg
motion-2007-09-08-11-29-11.jpg
motion-2007-09-08-11-33-39.jpg
motion-2007-09-08-11-38-36.jpg
motion-2007-09-08-11-43-35.jpg
motion-2007-09-08-11-48-45.jpg
motion-2007-09-08-11-53-55.jpg
motion-2007-09-08-11-58-49.jpg
motion-2007-09-08-12-03-52.jpg
motion-2007-09-08-12-09-59.jpg
motion-2007-09-06-09-08-22.jpg
motion-2007-09-06-15-29-47.jpg
motion-2007-09-06-21-57-47.jpg
motion-2007-09-06-23-30-33.jpg
motion-2007-09-06-23-39-28.jpg
motion-2007-09-06-23-48-39.jpg
motion-2007-09-07-00-01-08.jpg
motion-2007-09-07-00-10-03.jpg
motion-2007-09-06-08-54-05.jpg
motion-2007-09-06-23-10-56.jpg
motion-2007-09-06-23-23-10.jpg
motion-2007-09-06-23-34-37.jpg
motion-2007-09-06-23-42-25.jpg
motion-2007-09-06-23-52-58.jpg
motion-2007-09-07-00-03-49.jpg
motion-2007-09-07-00-14-08.jpg
motion-2007-09-05-22-51-52.jpg
motion-2007-09-05-22-55-42.jpg
motion-2007-09-05-22-59-47.jpg
motion-2007-09-05-23-34-27.jpg
motion-2007-09-05-23-38-31.jpg
motion-2007-09-05-23-41-50.jpg
motion-2007-09-05-23-45-54.jpg
motion-2007-09-05-23-49-44.jpg
motion-2007-09-05-23-53-49.jpg
motion-2007-09-05-23-57-07.jpg
motion-2007-09-06-00-01-12.jpg

Nie wiem gdzie tu logika - natsort() to chyba sortowanie naturalne, nie rozumiem dlaczego pliki są posortowane w takiej kolejności.
Nie poddałem się od razu i napisałem sam funkcję która posortuje pliki według daty ostatniej modyfikacji:
  1. <?php
  2. $sortuj = 1;
  3. while ( $soruj == 1)
  4. {
  5. $sortuj = 0;
  6. $i = 1;
  7. $por_1 = filemtime ($kamera . $tablica_plikow[0]); //pobieram pierwsza date do porownania
  8. while ( $i < count($tablica_plikow))
  9. {
  10. $por_2 = filemtime ($kamera . $tablica_plikow[$i]);
  11. if ( $por_1 < $por_2)
  12. {
  13. $por_1 = $por_2;
  14. $i++;
  15. }
  16. else
  17. {
  18. $temp = $tablica_plikow[$i];
  19. $j = $i;
  20. $tablica_plikow[$i] = $tablica_plikow[$j--];
  21. $j = $i;
  22. $tablica_plikow[$j--] = $temp;
  23. $i++;
  24. $sortuj = 1;
  25. }
  26. }
  27. }
  28. ?>

po zastosowaniu takiego sortowania kolejność wyświetlania plików jest identyczna jak w przypadku zastosowania sortowania natsort().
Pomyślałem żeby spróbować wykorzystać nazwę pliku (czyli np. motion-2007-09-08-10-09-13.jpg - bo takie nazwy zostają im nadawane przez kamery) i na podstawie daty w nich zawartej sortować te pliki.
Stworzyłem skrypt który czyta najpierw rok z dwóch pierwszych plików, porównuje je - jeśli I jest starszy to przechodzi dalej; - jeśli II jest starszy to zamienia je i przechodzi dalej; - jeśli są równe to czyta miesiąc i robi dokładnie to samo co w przypadku roku... potem dzien, godzina, minuta i sekunda.

  1. <?php
  2. $wskaznik = 1;
  3. while ($wskaznik == 1)
  4. {
  5. $wskaznik = 0; //wskaźnik // "0"
  6. $x = $tablica_plikow[0]; //pobiera nazwe I el.
  7. $xi = substr ($tablica_plikow[0],7,4); //wpisuje rok
  8. $l = 1; //wart pocz.
  9. while ( $l < count ($tablica_plikow)) //"1"
  10. {
  11. $y = $tablica_plikow[$l]; //pobiera nazwe II el.
  12. $yi = substr ($tablica_plikow[$l],7,4); //wypisuje rok
  13.  
  14. if ($xi < $yi) // "1.1"
  15. {
  16. $xi = $yi;
  17. $l++;
  18. }
  19. else
  20. {
  21. if ($xi != $yi) // "1.2"
  22. {
  23. $temp = $y;
  24. $tablica_plikow[$l] = $x;
  25. $tablica_plikow[$l-1] = $temp;
  26. $l++;
  27. $wskaznik = 1;
  28. }
  29. else 
  30. {
  31. $xi = substr ($tablica_plikow[$l-1],12,2); // "2" wypisuje miesiac
  32. $yi = substr ($tablica_plikow[$l],12,2); // wypisuje miesiac
  33. if ($xi < $yi) // "2.1"
  34. {
  35. $xi = $yi;
  36. $l++;
  37. }
  38. else
  39. {
  40. if ($xi != $yi) // "2.2"
  41. {
  42. $temp = $y;
  43. $tablica_plikow[$l] = $x;
  44. $tablica_plikow[$l-1] = $temp;
  45. $l++;
  46. $wskaznik = 1;
  47. }
  48. else
  49. {
  50. $xi = substr ($tablica_plikow[$l-1],15,2); // "3" wypisuje dzien
  51. $yi = substr ($tablica_plikow[$l],15,2); //wypisuje dzien
  52. if ($xi < $yi) // "3.1"
  53. {
  54. $xi = $yi;
  55.  $l++;
  56. }
  57. else
  58. {
  59. if ($xi != $yi) // "3.2"
  60. {
  61. $temp = $y;
  62. $tablica_plikow[$l] = $x;
  63. $tablica_plikow[$l-1] = $temp;
  64. $l++;
  65. $wskaznik = 1;
  66. }
  67. else 
  68. {
  69. $xi = substr ($tablica_plikow[$l-1],18,2); // "4" //wypisuje godzine
  70. $yi = substr ($tablica_plikow[$l],18,2); //wypisuje godzine
  71. if ($xi < $yi) // "4.1"
  72. {
  73. $xi = $yi;
  74.  $l++;
  75. }
  76. else
  77. {
  78. if ( $xi != $yi) // "4.2"
  79. {
  80. $temp = $y;
  81. $tablica_plikow[$l] = $x;
  82. $tablica_plikow[$l-1] = $temp;
  83.  $l++;
  84. $wskaznik = 1;
  85. }
  86. else
  87. {
  88. $xi = substr ($tablica_plikow[$l-1],21,2); // "5" //wypisuje minute
  89. $yi = substr ($tablica_plikow[$l],21,2); //wypisuje minute
  90. if ($xi < $yi) // "5.1"
  91. {
  92. $xi = $yi;
  93.  $l++; 
  94. }
  95. else
  96. {
  97. if ($xi != $yi) // "5.2"
  98. {
  99. $temp = $y;
  100. $tablica_plikow[$l] = $x;
  101. $tablica_plikow[$l-1] = $temp;
  102.  $l++;
  103. $wskaznik = 1;
  104. }
  105. else
  106. {
  107. $xi = substr ($tablica_plikow[$l-1],24,2); // "6" //wypisuje sekunde
  108. $yi = substr ($tablica_plikow[$l],24,2); //wypisuje sekunde
  109. if ($xi < $yi)
  110. {
  111. $xi = $yi;
  112.  $l++;
  113. }
  114. else
  115. {
  116. $temp = $y;
  117. $tablica_plikow[$l] = $x;
  118. $tablica_plikow[$l-1] = $temp;
  119.  $l++;
  120. $wskaznik = 1;
  121. }
  122. }
  123. }
  124. }
  125. }
  126. }
  127. }
  128. }
  129. }
  130. }
  131. }
  132. }
  133. }
  134. ?>

No i tu pojawił się problem... program sie zapętla.... możliwe że dzieje sie tak ze względu na dużą ilość plików (ok. 500) - petla jest wykonywana tak długo aż wszystkie pliki nie będą poukładane w odpowiedniej kolejności - przynajmniej takie były założenia.

Podsumowując chciałbym prosić o pomoc. Nie wiem czy mam kombinować dalej z tym ostatnim pomyslem czy jest jakiś inny, być może łatwiejszy sposób, żeby posortować to jak należy.
Za wszelką pomoc, jakieś wskazówki z góry dziekuje
Pozdrawiam
Tomek Kierat

Ten post edytował tomekohio 11.09.2007, 12:34:44
Go to the top of the page
+Quote Post
-Wieviór-
post
Post #2





Goście







Możesz wrzucić to do bazy danych i stworzyć w tabeli pole z datą, które będzie miało taki format:

YY-mm-dd-HH-ii-ss

I według tego pola potem sortujesz. Nie jest to na pewno najlepsze rozwiązanie, ale możliwe, że tak po prostu będzie najszybciej i najoszczędniej ;]

Ten post edytował Wieviór 11.09.2007, 12:41:13
Go to the top of the page
+Quote Post
tomekohio
post
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 13.01.2004
Skąd: Ohio

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


Cytat(Wieviór @ 11.09.2007, 13:40:27 ) *
Możesz wrzucić to do bazy danych ....


Chciałbym uniknąć korzystania z bazy danych, chodzi o to żeby całości nie trzeba było za dużo konfigurować, zresztą przyznam się że puki co bazy danych to dla mnie czarna magia :/
Go to the top of the page
+Quote Post
Kicok
post
Post #4





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


1. Przy takich nazwach pliku (liczby o stałej długości, dopełniane zerami z lewej strony) wystarczy zwykłe sortowanie.
2. natsort" title="Zobacz w manualu PHP" target="_manual zachowuje relacje klucz => wartość, czyli jeśli posortujesz tablicę:
Kod
0 => 'bbb'
1 => 'aaa'
2 => 'ccc'


to otrzymasz:
Kod
1 => 'aaa'
0 => 'bbb'
2 => 'ccc'



Jeśli teraz tą posortowaną tablicę będziesz wyświetlał przy pomocy pętli for( $i=0; $i<count( $tablica ); $i++ ), to na ekranie zobaczysz:
Kod
bbb
aaa
ccc



Zainteresuj się funkcją: array_values" title="Zobacz w manualu PHP" target="_manual


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
tomekohio
post
Post #5





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 13.01.2004
Skąd: Ohio

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


to jak zrobić żeby zapisać to w ten sposób?
Kod
[0] => 'aaa'
[1] => 'bbb'
[2] => 'ccc'


Ten post edytował tomekohio 13.09.2007, 10:48:53
Go to the top of the page
+Quote Post
wiero
post
Post #6





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 7.09.2007

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


alternatywnie po tak posortowanej tablic można przejść
CODE

foreach($tablica as $t)
echo $t;
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 - 00:40