Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Sortowanie zdjęć według daty modyfikacji
Forum PHP.pl > Forum > Przedszkole
arekko
Witam, mam taki kod który wyświetla miniatury z pliku i chciałbym zmienić go tak aby wyświetlał je według kolejności modyfikacji. Pomoże ktoś?

<div align="center" id="galeria";>
<ul><?php
$katalog = "obrazki";
$katalogminiaturki = "miniaturki";
$galeria = opendir( $katalog );
while ( $zdjecie = readdir( $galeria ) ){
$odczyt = pathinfo( $katalog.'/'.$zdjecie );
if ( $odczyt['extension'] == 'jpg' ){
echo '<li>
<a rel="mlbox[test]" href="'.$katalog.'/'.$zdjecie.'" rel="mlbox" >
<img src="'.$katalogminiaturki.'/'.$zdjecie.'" alt="ZdjÍcie: '.$zdjecie.'" /></a></li>';
}
}
closedir($galeria);
?>
</ul>
</div>
arekko
A mógłbyś dokładnie powiedzieć jak to przeszktałcić?
Nie znam sie na php za bardzo a potrzebuje tego na szybko.
ctom
Cytat(arekko @ 11.01.2015, 18:04:12 ) *
Nie znam sie na php za bardzo a potrzebuje tego na szybko.


@arekko urastasz do miana mojego bohatera :-) ... skoro umiesz się tak dobrze sprzedać to może ten model biznesowy będzie Ci bardziej na rękę niż programowanie
Kshyhoo
Niekoniecznie trzeba zakładać 3 wątki.
http://forum.php.pl/index.php?showtopic=239099
http://forum.php.pl/index.php?showtopic=238539
http://forum.php.pl/index.php?showtopic=238317

Proszę użyć bb-code dla kodu.
arekko
Zrobiłem coś takiego, zdjęcia się wyświetlają z datą modyfikacji i nazwą jednak nie są posortowane według kolejności. Wyskakuje mi też coś takiego:

Warning: filemtime() [function.filemtime]: stat failed for 2.png in /home/u181711956/public_html/test/test.php on line 33

A 33 linia to: $zdjecia[filemtime($zdjecie)] = $zdjecia;

A to kod:
  1. <?php
  2. $katalog = "obrazki";
  3. $katalogminiaturki = "miniaturki";
  4. $galeria = opendir( $katalog );
  5.  
  6. while ( false !== ( $zdjecie = readdir( $galeria ) ))
  7. {
  8. $odczyt = pathinfo( $katalog.'/'.$zdjecie );
  9.  
  10. if ($zdjecie != '.' && $zdjecie != '..')
  11. {
  12.  
  13. {
  14. $zdjecia[filemtime($zdjecie)] = $zdjecia;
  15. }
  16. }
  17.  
  18. krsort($zdjecia);
  19. foreach ($zdjecia as $filetime => $filename )
  20.  
  21. {
  22. echo date('F d Y, H:i:s', $filetime) . '-' . $filename . '
  23. <a rel="mlbox[test]" href="'.$katalog.'/'.$zdjecie.'" rel="mlbox" >
  24. <img src="'.$katalogminiaturki.'/'.$zdjecie.'" alt="ZdjÍcie: '.$zdjecie.'" /></a>';
  25.  
  26.  
  27. }
  28. }
  29.  
  30.  
  31. ?>


Gdzie tu jest problem?
phpion
Do filemtime przekaż całą ścieżkę do pliku, czyli $katalog.'/'.$zdjecie
trueblue
W linii 33.
$zdjecia[filemtime($zdjecie)] = $zdjecia;
filemtime nie zgadnie w jakim katalogu siedzi zdjęcie jeśli nie znajdzie w bieżącym.

P.S. $zdjecia[...]=$zdjecia ?
Kshyhoo
Cytat(arekko @ 6.02.2015, 15:47:22 ) *
Gdzie tu jest problem?

Kilka razy prosiłem o stosowanie bb-code dla kodu. Następnym razem zablokuję wątek. Proszę uzupełnić zaległości.
arekko
Okej, błędu już nie ma. Jednak zdjęcia dalej nie są posortowane według daty. Obok zdjęcia wyskakuje mi data "January 24 2015, 16:30:28-Array" i to obok każdego taka sama. Coś tu nie działa.
Kod wygląda teraz tak:
  1. <?php
  2. $katalog = "obrazki";
  3. $katalogminiaturki = "miniaturki";
  4. $galeria = opendir( $katalog );
  5.  
  6. while ( false !== ( $zdjecie = readdir( $galeria ) ))
  7. {
  8. $odczyt = pathinfo( $katalog.'/'.$zdjecie );
  9.  
  10. if ($zdjecie != '.' && $zdjecie != '..')
  11. {
  12.  
  13. {
  14. $zdjecia[filemtime($katalog)] = $zdjecia;
  15. }
  16. }
  17.  
  18. krsort($zdjecia);
  19. foreach ($zdjecia as $filetime => $filename )
  20.  
  21. {
  22. echo date('F d Y, H:i:s', $filetime) . '-' . $filename . '
  23. <a rel="mlbox[test]" href="'.$katalog.'/'.$zdjecie.'" rel="mlbox" >
  24. <img src="'.$katalogminiaturki.'/'.$zdjecie.'" alt="ZdjÍcie: '.$zdjecie.'" /></a>';
  25.  
  26.  
  27. }
  28. }
  29.  
  30.  
  31. ?>


Co jest nie tak?
nospor
Juz raz ci to pokazywano...
$zdjecia[filemtime($katalog)] = $zdjecia;
staraj sie czytac co ci pisza....

filemtime ma sie odnosic do pliku a nie do katalogu.. Nie rozrozniasz tych dwoch pojec?
Do tablicy $zdjecia masz wsadzic $zdjecie a nie znowu tablice $zdjecia...
arekko
Zmodyfikowany kod:
  1. <?php
  2. $katalog = "obrazki";
  3. $katalogminiaturki = "miniaturki";
  4. $galeria = opendir( $katalog );
  5.  
  6. while ( false !== ( $zdjecie = readdir( $galeria ) ))
  7. {
  8. $odczyt = pathinfo( $katalog.'/'.$zdjecie );
  9.  
  10. if ($zdjecie != '.' && $zdjecie != '..')
  11. {
  12.  
  13. {
  14. $tablica[filemtime( $katalog.'/'.$zdjecie )] = $zdjecie;
  15. }
  16. }
  17.  
  18.  
  19. krsort($tablica);
  20. foreach ($tablica as $filetime => $filename )
  21.  
  22. {
  23. echo date('F d Y, H:i:s', $filetime) . '.' . $filename . '
  24. <a rel="mlbox[test]" href="'.$katalog.'/'.$zdjecie.'" rel="mlbox" >
  25. <img src="'.$katalogminiaturki.'/'.$zdjecie.'" alt="ZdjÍcie: '.$zdjecie.'" /></a>';
  26.  
  27.  
  28. }
  29. }
  30.  
  31. closedir($galeria);
  32.  
  33.  
  34. ?>


Wyświetla nazwę zdjęcia i czas modyfikacji, jednak zdjęcia wyświetlają się podwójnie lub nawet potrójnie, nie wiem czemu. Kod dalej nie sortuje zdjęć według daty.
nospor
foreach ($tablica as $filetime => $filename )
{

echo date('F d Y, H:i:s', $filetime) . '.' . $filename . '

<a rel="mlbox[test]" href="'.$katalog.'/'.$zdjecie.'" rel="mlbox" >

<img src="'.$katalogminiaturki.'/'.$zdjecie.'" alt="ZdjÍcie: '.$zdjecie.'" /></a>';
}
Przeciez w tej petli, zdjecie masz pod $filename a nie $zdjecie.... Nic dziwnego, ze ciagle ci sie wyswietla ostatnio zapamietane zdjecie pod $zdjecie
arekko
Wszystkie zdjęcia się wyświetlają z datą i nazwą i jest ok. Tylko że wyświetlają sie po dwa-trzy razy.

Z 6 zdjęć wychodzi takie coś:

February 05 2015, 18:44:19.0.png
February 07 2015, 13:43:13.DSC03760.JPG
February 05 2015, 18:44:19.0.png
February 07 2015, 13:43:13.DSC03760.JPG
February 05 2015, 18:44:19.0.png
February 05 2015, 18:09:36.1.png
February 07 2015, 13:43:13.DSC03760.JPG
February 05 2015, 18:44:19.0.png
February 05 2015, 18:42:47.DSC07122.JPG
February 05 2015, 18:09:36.1.png
February 07 2015, 13:43:13.DSC03760.JPG
February 05 2015, 18:44:19.0.png
February 05 2015, 18:42:47.DSC07122.JPG
February 05 2015, 18:09:36.1.png
February 07 2015, 13:43:13.DSC03760.JPG
February 05 2015, 19:03:32.krajobraz.JPG
February 05 2015, 18:44:19.0.png
February 05 2015, 18:42:47.DSC07122.JPG
February 05 2015, 18:09:36.1.png
February 07 2015, 13:43:13.DSC03760.JPG
February 05 2015, 19:03:32.krajobraz.JPG
February 05 2015, 18:44:19.0.png
February 05 2015, 18:42:47.DSC07122.JPG
February 05 2015, 18:09:36.2.png
February 07 2015, 13:43:13.DSC03760.JPG
February 05 2015, 19:03:32.krajobraz.JPG
February 05 2015, 18:44:19.0.png
February 05 2015, 18:42:47.DSC07122.JPG
February 05 2015, 18:09:36.2.png
nospor
poniewasz sortowanie i wyswietlanie dales w WHILE.... A sortowanie i wyswietlanie ma byc ZA WHILE
arekko
Dzięki po zmianie zamknięcia pętli wszytko działa b. dobrze oprócz tego że niektóre zdjęcia nie są wyświetlane ..

z 9 zdjęć na serwerze wyświetliło się tylko 7:
January 24 2015, 21:17:23--10913166_909191255792618_1235845444_n.jpg
January 24 2015, 21:11:01--10884555_909193862459024_827172990_n.jpg
January 24 2015, 21:07:14--10866767_909193779125699_1868183354_n.jpg
January 24 2015, 21:05:42--IMG_5569.JPG
January 24 2015, 21:03:59--IMG_5532.JPG
January 21 2015, 17:07:43--portret.JPG
January 21 2015, 17:06:52--5.jpg

Ktoś ma jakiś pomysł na to?
Kod wygląda tak:
  1. <?php
  2. $katalog = "obrazki";
  3. $katalogminiaturki = "miniaturki";
  4. $galeria = opendir( $katalog );
  5.  
  6. while ( false !== ( $zdjecie = readdir( $galeria ) ))
  7. {
  8. $odczyt = pathinfo( $katalog.'/'.$zdjecie );
  9.  
  10. if ($zdjecie != '.' && $zdjecie != '..')
  11. {
  12.  
  13. {
  14. $tablica[filemtime( $katalog.'/'.$zdjecie )] = $zdjecie;
  15. }
  16. }
  17. }
  18. closedir($galeria);
  19.  
  20.  
  21. krsort($tablica);
  22. foreach ($tablica as $filetime => $filename )
  23.  
  24. {
  25. echo date('F d Y, H:i:s', $filetime) . '--' .$filename. '
  26. <a rel="mlbox[test]" href="'.$katalog.'/'.$filename.'" rel="mlbox" >
  27. <img src="'.$katalogminiaturki.'/'.$filename.'" alt="ZdjÍcie: '.$filename.'" /></a>';
  28.  
  29.  
  30. }
  31.  
  32. ?>
nospor
Pewnie czesc zdjec ma te sama date zapisu i sie nadpisuja ci w tablicy
arekko
Więc da się temu zaradzić jakoś? Mam już zdjęcia dodane na serwer.

Co z tym mogę zrobić?
nospor
zamiast zdjecia nadpisywac:
$tablica[filemtime( $katalog.'/'.$zdjecie )] = $zdjecie;
masz je dopisywac o tak:

  1. $tablica[] = array('zdjecie' =>$zdjecie,'czas' => filemtime( $katalog.'/'.$zdjecie ));

A pozniej sortowac np. przy pomocy
http://php.net/manual/en/function.usort.php
arekko
Gdy zastosuje taki kod:
  1. <?php
  2. $katalog = "obrazki";
  3. $katalogminiaturki = "miniaturki";
  4. $galeria = opendir( $katalog );
  5.  
  6. while ( false !== ( $zdjecie = readdir( $galeria ) ))
  7. {
  8. $odczyt = pathinfo( $katalog.'/'.$zdjecie );
  9.  
  10. if ($zdjecie != '.' && $zdjecie != '..')
  11. {
  12.  
  13. {
  14. $tablica[] = array('zdjecie' =>$zdjecie,'czas' => filemtime( $katalog.'/'.$zdjecie ));
  15. }
  16. }
  17. }
  18.  
  19.  
  20.  
  21. krsort($tablica);
  22. foreach ($tablica as $filetime => $filename )
  23.  
  24. {
  25. echo date($filetime). '--' .$filename. '
  26. <li><a rel="mlbox[test]" href="'.$filename.'" rel="mlbox" >
  27. <img src="'.$filename.'" alt="ZdjÍcie: '.$zdjecie.'" /></a></li>';
  28. }
  29.  
  30. ?>


wychodzi cos takiego:
6--Array
5--Array
4--Array
3--Array
2--Array
1--Array
0--Array

Mógłbyś powiedzeić mi dokładnie jak mam to napisaćquestionmark.gif?
trueblue
W pętli niepotrzebny klucz.
Ścieżka bez katalogu jest w $filename['zdjecie'], czas w $filename['czas']
arekko
Poprawiłem na coś takiego:
  1. <?php
  2. $katalog = "obrazki";
  3. $katalogminiaturki = "miniaturki";
  4. $galeria = opendir( $katalog );
  5.  
  6. while ( false !== ( $zdjecie = readdir( $galeria ) ))
  7. {
  8. $odczyt = pathinfo( $katalog.'/'.$zdjecie );
  9.  
  10. if ($zdjecie != '.' && $zdjecie != '..')
  11. {
  12.  
  13. {
  14. $tablica[] = array($filename['zdjecie'] =>$zdjecie, $filetime['czas'] => filemtime( $katalog.'/'.$zdjecie ));
  15. }
  16. }
  17. }
  18.  
  19.  
  20.  
  21. krsort($tablica);
  22. foreach ($tablica as $filetime => $filename )
  23.  
  24. {
  25. echo date($filetime). '--' .$filename. '
  26. <li><a rel="mlbox[test]" href="'.$filename.'" rel="mlbox" >
  27. <img src="'.$filename.'" alt="ZdjÍcie: '.$zdjecie.'" /></a></li>';
  28. }
  29.  
  30. ?


O jaki klucz chodzi?
trueblue
Trudno to nazwać poprawą. Wcześniej tablica była budowana poprawnie.
W pętli wyświetlającej zdjęcia powinieneś odnieść do elementów tabicy, które podałem - przecież właśnie z tym fragmentem zgłaszałeś problem...

Piąty przykład: http://www.p-programowanie.pl/php/tablice-asocjacyjne/
arekko
Teraz coś takiego:
  1.  
  2. $katalog = "obrazki";
  3. $katalogminiaturki = "miniaturki";
  4. $galeria = opendir( $katalog );
  5.  
  6. while ( false !== ( $zdjecie = readdir( $galeria ) ))
  7. {
  8. $odczyt = pathinfo( $katalog.'/'.$zdjecie );
  9.  
  10. if ($zdjecie != '.' && $zdjecie != '..')
  11. {
  12.  
  13. {
  14. $tablica[] = array('zdjecie' =>$zdjecie,'czas' => filemtime( $katalog.'/'.$zdjecie ));
  15. }
  16. }
  17. }
  18.  
  19.  
  20.  
  21. asort($tablica);
  22.  
  23. foreach ($tablica as $klucz => $wartosc)
  24. echo $klucz." --> ".$wartosc.'
  25. <a rel="mlbox[test]" href="'.$katalog.'/'.$filename.'" rel="mlbox" >
  26. <img src="'.$katalogminiaturki.'/'.$filename.'" alt="ZdjÍcie: '.$filename.'" /></a>';
  27.  
  28.  
  29.  
  30. ?>


Zdjęcia wyglądają na posortowane:
5 --> Array ZdjÍcie: 4 --> Array ZdjÍcie: 1 --> Array ZdjÍcie: 3 --> Array ZdjÍcie: 0 --> Array ZdjÍcie: 2 --> Array ZdjÍcie: 6 --> Array ZdjÍcie:

Jednak same obrazki się nie wyświetlają.
trueblue
Cytat(trueblue @ 10.02.2015, 19:49:23 ) *
W pętli wyświetlającej zdjęcia powinieneś odnieść do elementów tablicy, które podałem.

Podałem Ci:
$filename['zdjecie']
$filename['czas']

Ale skoro teraz zmieniłeś nazwę zmiennej to te dwie dane są w $wartosc.

Klucz nie jest potrzebny w pętli, podałem Ci przykład, bo pytałeś o jaki klucz chodzi, Ty natomiast przepisałeś ten przykład.
arekko
  1. <?php
  2. $katalog = "obrazki";
  3. $katalogminiaturki = "miniaturki";
  4. $galeria = opendir( $katalog );
  5.  
  6. while ( false !== ( $zdjecie = readdir( $galeria ) ))
  7. {
  8. $odczyt = pathinfo( $katalog.'/'.$zdjecie );
  9.  
  10. if ($zdjecie != '.' && $zdjecie != '..')
  11. {
  12.  
  13. {
  14. $tablica[] = array('zdjecie' =>$zdjecie,'czas' => filemtime( $katalog.'/'.$zdjecie ));
  15. }
  16. }
  17. }
  18.  
  19.  
  20.  
  21. asort($tablica);
  22. foreach ($tablica as $filetime => $filename )
  23.  
  24. {
  25. echo ($filename['zdjecie']). '--' .$filename['czas']. '
  26. <li><a rel="mlbox[test]" href="'.$filename.'" rel="mlbox" >
  27. <img src="'.$filename.'" alt="ZdjÍcie: '.$filename.'" /></a></li>';
  28. }
  29.  
  30. ?>


Tym razem coś takiego jak powyżej. Zdjęcia wyświetają sie według nazwy a nie daty…


Pozmieniałem trochę i już się sortują:
  1.  
  2. $katalog = "obrazki";
  3. $katalogminiaturki = "miniaturki";
  4. $galeria = opendir( $katalog );
  5.  
  6. while ( false !== ( $zdjecie = readdir( $galeria ) ))
  7. {
  8. $odczyt = pathinfo( $katalog.'/'.$zdjecie );
  9.  
  10. if ($zdjecie != '.' && $zdjecie != '..')
  11. {
  12.  
  13. {
  14. $tablica[] = array('czas' => filemtime( $katalog.'/'.$zdjecie ), 'zdjecie' => $zdjecie);
  15. }
  16. }
  17. }
  18.  
  19.  
  20.  
  21. asort($tablica);
  22. foreach ($tablica as $filename)
  23.  
  24. {
  25. echo ($filename['czas']. '--' .$filename['zdjecie']). '
  26. <li><a rel="mlbox[test]" href="'.$katalog.'/'.$filename.'" rel="mlbox" >
  27. <img src="'.$katalogminiaturki.'/'.$filename.'" alt="ZdjÍcie: '.$filename.'" /></a></li>';
  28. }
  29.  
  30.  
  31.  


Jednak zdjęcia są tak jakby puste, jakby kod nie mógł znaleźć zdjęcia.


Już mam:
problem leżał tutaj
  1. <li><a rel="mlbox[test]" href="'.$katalog.'/'.$filename['zdjecie'].'" rel="mlbox" >
  2. <img src="'.$katalogminiaturki.'/'.$filename['zdjecie'].'" alt="ZdjÍcie: '.$filename.'" /></a></li>';

  1. '.$katalog.'/'.$filename['zdjecie'].'
  2. '.$katalogminiaturki.'/'.$filename['zdjecie'].'


Wygląda na to że działa, zobaczymy jak w praktyce, dzięki smile.gif



Zdjęcia się sortują i wyświetlają ok. Problem jest jednak taki, że jak na serwerze mam jedno zdjęcie z Stycznia 2015 a drugie z Lutego 2015 roku, to nie sortują się one poprawnie.. Jak temu zapobiec, żeby kod uwzględniał pełną datę? sekundy, minuty, godziny, dni, miesiące i lata?

Takie coś nie działa:
  1. date('F d Y, H:i:s', $filename['czas']. '-->' .$filename['zdjecie']).
trueblue
Ja już nie mam siły Ci tłumaczyć, może znajdzie się ktoś ze stuprocentowym stanem cierpliwości do Ciebie.
Powodzenia!
arekko
W takim razie jak mam to napisać?

Zamiast: asort($tablica);

Wystarczyło dać: arsort($tablica);

Dzięki za pomoc smile.gif

Temat można zamknąć.
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.