Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] sortowanie tablicy
Forum PHP.pl > Forum > Przedszkole
tomekohio
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
Wieviór
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 ;]
tomekohio
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 :/
Kicok
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
tomekohio
to jak zrobić żeby zapisać to w ten sposób?
Kod
[0] => 'aaa'
[1] => 'bbb'
[2] => 'ccc'
wiero
alternatywnie po tak posortowanej tablic można przejść
CODE

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