Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [solved] [PHP] jak posortować pliki z katalogu ?
Forum PHP.pl > Forum > Przedszkole
hiszpanespaniol
witam.
próbowałem już wielu kombinacji i różnych funkcji pobierających listę plików (opendir, readdir, klasa dir, scandir) ale chyba się poddaję. Potrzebuję skryptu który:
1. pobierze listę plików z katalogu
2. odetnie rozszeżenie (pliki mają w nazwie jedną kropkę tylko i rozszerzenie html)
3. wyświetli echo nazw plików bez rozszerzenia i stworzy menu. przykładowo a href="index.php&wyswietl=start" po najechaniu na pozycję stworzoną na pdst pliku start.html. Menu ma być posortowane alfabetycznie lub według daty modyfikacji.

Mam już zrobiony skrypt, ale nie wyświetla alfabetycznie:

  1. <?php
  2. $folder = dir(&apos;podstrony&apos;); 
  3. echo &apos;<ul id=&#092;"menu\">&apos;;
  4. while ($plik = $folder->read ())
  5. { 
  6. $zamiana_znakow = str_replace(&#092;"-\",\" \",$plik);
  7. if (($zamiana_znakow != &apos;.&apos;) AND ($zamiana_znakow != &apos;..&apos;))
  8. { 
  9. $file = pathinfo ($zamiana_znakow);
  10. echo&apos;<a href=&#092;"index.php?wyswietl=&apos; .$file[&apos;filename&apos;]. &apos;\">&apos; .$file[&apos;filename&apos;]. &apos;</a href=\"index.php?wyswietl=&apos; .$file[&apos;filename&apos;]. &apos;\">&apos;;
  11. }
  12. }  echo &apos;&apos;;
  13. ?>


i inny który wyświetla alfabetycznie, ale nie umiem zrobić z niego menu:

  1. <?php
  2. foreach(glob(&apos;*&apos;, GLOB_BRACE) as $file)
  3. if($file != &apos;.&apos; && $file != &apos;..&apos;)
  4. $pliki = explode(&#092;".html\", $file);
  5. echo &apos;<li><a href=&apos; .$file. &apos;>&apos; .$pliki . &apos;</a href=&apos; .$file. &apos;>&apos;;
  6. ?>


w tym drugim trochę namieszałem z explode bo wyświetlało dobrze (alfabetycznie i menu było z linkami. niestety z rozszerzeniem), ale po dodaniu explode wyświetla tylko ostatnią pozycję menu, a zamiast nazwy pliku wyskakuje "array".
Dziękuję z góry za pomoc. Męczę się z tym od kilku dni już. </ul id=\"menu\">
soulreaver1
Może spróbuj tak..

  1. <?php
  2. foreach(glob('*', GLOB_BRACE) as $file)
  3. if($file != '.' && $file != '..')
  4. {
  5. $pliki = "substr($file, 0, strrpos($file, '.'))";
  6. echo '<li><a href=' .$file. '>' .$pliki . '</a></li>';
  7. }
  8. ?>
qqrq
  1. <?php
  2. $folder = sort(scandir('podstrony'));
  3. echo '<ul id="menu">';
  4. for($k=2,$c=count($folder);$k<$c;$k++)
  5.  echo'<li><a href="index.php?wyswietl=' .$folder[$k]. '">' .substr($folder[$k],0,-5). '</a></li>';
  6. echo '</ul>';
  7. ?>


Z palca, także sorry za byki.

Poza tym proponuję konsultację z manualem w sprawie funkcji explode - zerknij sobie co ona zwraca.
erix
Cytat
Kod
substr($folder[$k],0,-5)


A basename" title="Zobacz w manualu PHP" target="_manual, to co? tongue.gif

Cytat
Kod
$folder = dir('podstrony');


Tak samo z klasą DirectoryIterator; o ile pamiętam, to trzeba wrzucać pozycje do osobnej tablicy i ją dopiero przesortować...

IMHO, najlepiej by było posłużyć się odpowiednim ls-em, ale raczej nie masz odblokowanych funkcji powłoki w PHP...
qqrq
Cytat(erix @ 16.04.2008, 09:04:00 ) *


Co co? Chcesz mi powiedzieć, że zwrócą się ścieżki z plikami, a nie same nazwy plików?
nevt
popełniasz podstawowy błąd. w tej samej pętli odczytujesz i jednocześnie wyświetlasz listę. a sam piszesz, że chcesz ją najpierw posortować. zrób tak.

1. w pierwszej pętli odczytaj wszystkie nazwy plików, przefiltruj je (odrzucasz katalogi, obcinasz rozszerzenia, itp.) i dodaj do tablicy gdzie będziesz miał wyłącznie te nazwy (np. $files)
2. posortuj tą tablicę, np. $files = sort($files);
3. w drugiej pętli wyświetlaj sobie to menu / listę bazując na odfiltrowanej i posortowanej liście plików $files

prościej się nie da tego opisać.
erix
Cytat
a nie same nazwy plików?

A zajrzałeś chociaż do manuala?
hiszpanespaniol
@solureaver1: ten skrypt powoduje wyświetlenie czegoś takiego ale spróbuję to zrobić. Co do rady @nevt - zrobię jak piszesz jednak trochę mi z tym zejdzie smile.gif . @qqrq ten sposób nie wyświetla mi nic, ale też pokombinuję.
dzięki wszystkim

@solureaver1: wystarczyło mi usunąć cudzysłów przy definiowaniu zmiennej $pliki. teraz jest ok tylko co pewien czas pojawiają się przerwy np. są linki linki linki a później 3 linikji pustego miejsca i dalej linki. poza tym ok.
.... już jest całkiem dobrze - dodałem znaczniki listy html przed i po skrypcie. Także problem rozwiązany. Zajmę się teraz metodą podaną przez @nevt, tak żeby się wprawić.

Dziękuję wszystkim za pomoc

@nevt (czy ktoś inny, kto może pomóc) postąpiłem według Twoich wskazówek:

  1. <?php
  2. $folder = dir('podstrony'); 
  3. while ($plik = $folder->read ())
  4. { 
  5. $zamiana_znakow = str_replace("-"," ",$plik);
  6. if (($zamiana_znakow != '.') AND ($zamiana_znakow != '..'))
  7. {
  8. $lista = basename($zamiana_znakow, ".html");
  9. }
  10. $do_menu = array($lista);
  11. }
  12. echo '<ul id="menu">';
  13. foreach ($do_menu as $pozycja) 
  14. {
  15. echo'<li><a href="index.php?wyswietl=' .$pozycja. '">' .$pozycja. '</a></li>';
  16. }
  17. echo '</ul>';
  18. ?>


ale w menu tworzy się tylko jedna pozycja. Sortowanie jak zastosuję po 1szej pętli ($do_menu = sort($do_menu)winksmiley.jpg to wyskakuje mi błąd "Invalid argument supplied for foreach()".

Ja wiem, że błąd popełniam, ale nie wiem gdzie. Proszę o pomoc
nevt
  1. <?php
  2. $folder = dir('podstrony'); 
  3. $do_menu = array(); // inicjujesz pustą tablicę
  4. while ($plik = $folder->read ())
  5. { 
  6. $zamiana_znakow = str_replace("-"," ",$plik);
  7. if (($zamiana_znakow != '.') AND ($zamiana_znakow != '..'))
  8. $lista = basename($zamiana_znakow, ".html");
  9. $do_menu[] = $lista; // doadje do tablicy nowy element na końcu
  10. }
  11. echo '<ul id="menu">';
  12. sort($do_menu); // sortujemy
  13. foreach ($do_menu as $pozycja) 
  14. {
  15. echo'<li><a href="index.php?wyswietl=' .$pozycja. '">' .$pozycja. '</a></li>';
  16. }
  17. echo '</ul>';
  18. ?>

powodzenia
hiszpanespaniol
ten skrypt działa, ale niektóre pozycje wyświetla dwa razy. czyli chyba są dwa razy dodane do tablicy, obok siebie zawsze. Nie wiem jak to rozwiązać, ale próbuję.

Już smile.gif
Fajnie, dzięki. Brakowało klamr w If'ie, hehe to taki sprawdzian czy nie robię ctr+c i ctrl+v ?
O sortowaniu wg innych kryteriów zapewne piszą w manualu. Dziękuję za pomoc nevt
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.