Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: DirectoryIterator - sortowanie od A do Z
Forum PHP.pl > Forum > PHP
deha21
Witam,
Czy da się za pomocą DirectoryIteratora wyświetlić pliki w kolejności alfabetycznej? Czytałem, że można w tabliach ale może jest inny sposób. Nie lubię tablic i szczerze powiedziawszy nie za bardzo rozumiem winksmiley.jpg
Czy w takim kodzie da się posortować bez tablic?
  1. <?
  2. foreach ($dir as $file) {
  3. if (!$file->isDir()) {
  4. if(strripos($file,'.flv')==true || strripos($file,'.mov') || strripos($file,'.avi') || strripos($file,'.mpeg')|| strripos($file,'.mpeg') || strripos($file,'.mp4') || strripos($file,'.wmv')) {
  5.  
  6. echo "<li><a href='".$directory."/".$file."'><img src='images/movie.png' alt=''>&nbsp;".$file."</a>&nbsp;<a href='java script: confirmation($file)'><img src='images/delete.png' alt='[usuń]' title='Usuń'></a></li>";
  7.  
  8. }
  9. }
  10. }
  11. ?>

Pozdrawiam

erix
Cytat
Czy da się za pomocą DirectoryIteratora wyświetlić pliki w kolejności alfabetycznej?

Z tego, co mi wiadomo, to nie; nie w DirectoryIterator.

Cytat
Czytałem, że można w tabliach ale może jest inny sposób. Nie lubię tablic i szczerze powiedziawszy nie za bardzo rozumiem

brzydal.gif

Będziesz musiał więc zrozumieć i polubić. Prędzej, czy później - czy tego chcesz, czy nie.
ersiu
możesz spisać wszystkie pliki do tablicy, a następnie użyć funkcji sort. ; )

np.
  1. <?
  2. $files = array();
  3. foreach ($dir as $file) {
  4. if (!$file->isDir()) {
  5. if(strripos($file,'.flv')==true || strripos($file,'.mov') || strripos($file,'.avi') || strripos($file,'.mpeg')|| strripos($file,'.mpeg') || strripos($file,'.mp4') || strripos($file,'.wmv')) {
  6. $files[] = array($directory, $file);
  7. }
  8. }
  9. }
  10. sort($files);
  11. foreach($files as $file){
  12. echo "<li><a href='".$files[0]."/".$files[1]."'><img src='images/movie.png' alt=''>&nbsp;".$files[1]."</a>&nbsp;<a href='java script: confirmation($file[1])'><img src='images/delete.png' alt='[usuń]' title='Usuń'></a></li>";
  13. }
  14.  
  15. ?>
deha21
Chyba sortuje ale nie wszystko bo wyskakuje mi lista:
  1. przebitki.avi
  2. wakacje.mov


Ogółem są 4 Pliki. Skopiowałem całość ze strony bez przerabiania, czy z przerabianiem, wyświetla źle... Zastanawiam się czy plików nie wyświetlić w tabelach i za pomocą jquery je posortować. Myślicie że to dobre rozwiązanie?
Whisller
Kiedyś robiłem coś podobnego i ogólnie można zrobić to tak - klasa sortowania znaleziona w internecie.

  1. $files = array();
  2.  
  3. $di = new DirectoryIterator( $this->path );
  4.  
  5. foreach( $di as $file )
  6. {
  7. $files[] = $file->getFileInfo();
  8. }
  9.  
  10. $oSort = new ObjSorter( &$files );
  11.  
  12. class ObjSorter
  13. {
  14. public function __construct( array $files, $sortBy = null )
  15. {
  16. if ( !is_null( $sortBy ) || !empty( $sortBy ) && $this->isAvailableToSort($sortBy) )
  17. {
  18. $this->sortBy = $sortBy;
  19. usort( $files, array($this, 'sort') );
  20. }
  21. }
  22.  
  23. private function isAvailableToSort( $sortBy = null )
  24. {
  25. if ( isset( $this->availableSortBy[$sortBy] ) )
  26. {
  27. return true;
  28. }
  29.  
  30. return false;
  31. }
  32.  
  33. public function sort($apple, $orange)
  34. {
  35. $property = 'get'.$this->sortBy;
  36.  
  37. if ($apple->{$property}() == $orange->{$property}()) return 0;
  38. return ($apple->{$property}() < $orange->{$property}()) ? -1 : 1;
  39. }
  40.  
  41. private $availableSortBy = array('Filename',
  42. 'Size');
  43. private $sortBy = null;
  44. }
deha21
Klasy, to za wysoko dla mnie jak jak na razie winksmiley.jpg Wolę pokombinować z tablicach, tym bardziej, jak napisał erix, muszę się ich nauczyć bo w przyszłości na pewno mi się przydadzą.
Więc kombinuję. Na razie chce zrobić sortowanie katalogów.
  1. <?
  2. $dir=new DirectoryIterator('../'.$directory);
  3.  
  4. $catalogarr = array();
  5.  
  6. //CATALOGS
  7. foreach ($dir as $catalog) {
  8. if ($catalog->isDir() && !$catalog->isDot()) {
  9. $catalogarr[] = array($catalog);
  10. }
  11. }
  12.  
  13. sort($catalogarr);
  14. foreach($catalogarr as $catalog){
  15. echo "<li><a href='filesbrowser.php?directory=".$directory."/".$catalog[0]."'><img src='images/folder.png' alt='[folder]'>&nbsp;<B>".$catalog[0]."</B></a></li>";
  16. }
  17. ?>


To przekształcony przykład ersiu, przy czym tu nie zapisuję $directory do tablicy, bo jest ono pobierane przez GET i dopisywane do ścieżki. Zresztą, czy dopiszę czy nie to i tak nie działa. Albo wyskakuje lista folderów o nazwa Array albo bez nazwy.
Co tu robię źle?

Pozdrawiam
erix
  1. $catalogarr[] = array($catalog);

Przecież sam wpychasz wartość do tablicy. tongue.gif
deha21
Cytat(erix @ 22.08.2009, 12:01:37 ) *
  1. $catalogarr[] = array($catalog);

Przecież sam wpychasz wartość do tablicy. tongue.gif

No tak. Ale to chyba dobrze, nie? winksmiley.jpg

P.S Nie śmiać się, tablice są dla mnie obce winksmiley.jpg
erix
No niby składniowo dobrze, ale logicznie, to jaki jest w tym sens...? Jak funkcja sortująca ma na tym działać...?
deha21
Jak ma działać? Nie wiem, nie znam tej funkcji. Tablic też nie łapie.
Według mnie najpierw muszę wskazać co ma być w tej tablicy a potem to posortować.
erix
No właśnie, więc czemu wrzucasz tablicę w tablicy, skoro tego nie potrzebujesz...?
deha21
Hmm chyba mnie trochę oświeciłeś winksmiley.jpg
Najpierw deklarowałem zmienną jako tablicę a potem do tablicy wrzucałem tablicę. A miałem wrzucić jakieś dane, tak?

Teraz mam taki kod:
  1. <?
  2. $catalogarr = array();
  3.  
  4. //CATALOGS
  5. foreach ($dir as $catalog) {
  6. if ($catalog->isDir() && !$catalog->isDot()) {
  7. $catalogarr[] = $catalog;
  8. }
  9. }
  10.  
  11. sort($catalogarr);
  12. foreach($catalogarr as $catalog){
  13. echo "<li><a href='filesbrowser.php?directory=".$directory."/".$catalog[0]."'><img src='images/folder.png' alt='[folder]'>&nbsp;<B>".$catalog[0]."</B></a></li>"; // linijka 71
  14. }
  15. ?>


Teraz mam taki błąd (linia 71 zaznaczona wyżej):
  1. Fatal error: Cannot use object of type DirectoryIterator as array in filesbrowser.php on line 71


O co teraz chodzi? Bo w googlach nic na ten temat nie znalazłem.
erix
Może lepiej pokaż większą część skryptu.
deha21
Generalnie to coś takiego. Ominąłem kod który opisywał wygląd strony oraz listowanie plików (bo i tak będzie zmienione na posortowane tablice, jak w tym przypadku).
  1. if (!isset($_GET['directory'])) { $directory='files'; }
  2. else { $directory=htmlspecialchars($_GET['directory']); }
  3.  
  4. echo "<div id='filelist'>
  5. <ul class='folder'>";
  6.  
  7. if(strpos($directory,'.')===false && strpos($directory,'http')===false && $directory!='') {
  8.  
  9. if ($directory!='files') {
  10. echo "<a href='filesbrowser.php?directory=".dirname($directory)."' class='updir'><img src='images/up.png' alt='[up]'>&nbsp;do góry</a>";
  11. }
  12.  
  13. $dir=new DirectoryIterator('../'.$directory);
  14.  
  15. $catalogarr = array();
  16.  
  17. //CATALOGS
  18. foreach ($dir as $catalog) {
  19. if ($catalog->isDir() && !$catalog->isDot()) {
  20. $catalogarr[] = $catalog;
  21. }
  22. }
  23.  
  24. sort($catalogarr);
  25. foreach($catalogarr as $catalog){
  26. echo "<li><a href='filesbrowser.php?directory=".$directory."/".$catalog[0]."'><img src='images/folder.png' alt='[folder]'>&nbsp;<B>".$catalog[0]."</B></a></li>";
  27. }
  28.  
  29. echo "</ul>";
  30.  
  31. }
  32. else
  33. {
  34. echo "Błąd! Próbujesz się dostać do zablokowanego obszaru";
  35. }
  36.  
  37. echo "</div>";
erix
I która jest to ta 71. linia?
deha21
71 to linia 26 w powyższym kodzie.
golaod
Skoro odpuściłeś wprowadzania tablicy do tablicy to czemu odwołujesz się w pętli foreach tak: $catalog[0] ?
deha21
Nie mam pojęcia winksmiley.jpg Tak jak mówiłem tablice są mi obce.
Mógłby ktoś przepisać mój kod i napisać komentarze do tablic? Wtedy będę wiedział o co chodzi i może jakoś do tego dojdę.

Dzięki za cierpliwość winksmiley.jpg

EDIT: Rozwiązane! Już wiem w czym był problem. Nie w linijce 71. Chodził o to, że wartość do tablicy była źle zapisywana.
Był tak:
  1. <? $catalogarr[] = $catalog; ?.

A powinno być tak:
  1. <? $catalogarr[] = "$catalog"; ?.


Teraz wszystko działa... Hmm więc jednak te tablice trochę rozumiem winksmiley.jpg

Dzięki wszystkim.
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.