Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> DirectoryIterator - sortowanie od A do Z
deha21
post
Post #1





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

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


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 (IMG:style_emoticons/default/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

Go to the top of the page
+Quote Post
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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

(IMG:style_emoticons/default/brzydal.gif)

Będziesz musiał więc zrozumieć i polubić. Prędzej, czy później - czy tego chcesz, czy nie.
Go to the top of the page
+Quote Post
ersiu
post
Post #3





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 27.08.2007

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


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


Ten post edytował ersiu 21.08.2009, 22:49:42
Go to the top of the page
+Quote Post
deha21
post
Post #4





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

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


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





Grupa: Zarejestrowani
Postów: 77
Pomógł: 5
Dołączył: 29.03.2006
Skąd: Poznań

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


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. }
Go to the top of the page
+Quote Post
deha21
post
Post #6





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

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


Klasy, to za wysoko dla mnie jak jak na razie (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
erix
post
Post #7





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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

Przecież sam wpychasz wartość do tablicy. (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
deha21
post
Post #8





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

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


Cytat(erix @ 22.08.2009, 12:01:37 ) *
  1. $catalogarr[] = array($catalog);

Przecież sam wpychasz wartość do tablicy. (IMG:style_emoticons/default/tongue.gif)

No tak. Ale to chyba dobrze, nie? (IMG:style_emoticons/default/winksmiley.jpg)

P.S Nie śmiać się, tablice są dla mnie obce (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
erix
post
Post #9





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




No niby składniowo dobrze, ale logicznie, to jaki jest w tym sens...? Jak funkcja sortująca ma na tym działać...?
Go to the top of the page
+Quote Post
deha21
post
Post #10





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

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


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ć.
Go to the top of the page
+Quote Post
erix
post
Post #11





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




No właśnie, więc czemu wrzucasz tablicę w tablicy, skoro tego nie potrzebujesz...?
Go to the top of the page
+Quote Post
deha21
post
Post #12





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

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


Hmm chyba mnie trochę oświeciłeś (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
erix
post
Post #13





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Może lepiej pokaż większą część skryptu.
Go to the top of the page
+Quote Post
deha21
post
Post #14





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

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


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>";
Go to the top of the page
+Quote Post
erix
post
Post #15





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




I która jest to ta 71. linia?
Go to the top of the page
+Quote Post
deha21
post
Post #16





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

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


71 to linia 26 w powyższym kodzie.
Go to the top of the page
+Quote Post
golaod
post
Post #17





Grupa: Zarejestrowani
Postów: 419
Pomógł: 42
Dołączył: 12.08.2008
Skąd: Wrocław

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


Skoro odpuściłeś wprowadzania tablicy do tablicy to czemu odwołujesz się w pętli foreach tak: $catalog[0] ?
Go to the top of the page
+Quote Post
deha21
post
Post #18





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

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


Nie mam pojęcia (IMG:style_emoticons/default/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ść (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/winksmiley.jpg)

Dzięki wszystkim.

Ten post edytował deha21 24.08.2009, 11:08:18
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 04:48