Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [solved] [PHP] jak posortować pliki z katalogu ?, alfabetycznie lub wg modyfikacji. pliki tworzą menu html
hiszpanespaniol
post 15.04.2008, 23:48:23
Post #1





Grupa: Zarejestrowani
Postów: 213
Pomógł: 39
Dołączył: 7.04.2008
Skąd: 3city

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


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\">

Ten post edytował hiszpanespaniol 4.05.2008, 23:30:45


--------------------
Go to the top of the page
+Quote Post
soulreaver1
post 16.04.2008, 07:44:35
Post #2





Grupa: Zarejestrowani
Postów: 59
Pomógł: 6
Dołączył: 1.04.2008

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


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. ?>
Go to the top of the page
+Quote Post
qqrq
post 16.04.2008, 07:53:26
Post #3





Grupa: Zarejestrowani
Postów: 418
Pomógł: 8
Dołączył: 16.11.2006

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


  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.


--------------------
Go to the top of the page
+Quote Post
erix
post 16.04.2008, 08:04:00
Post #4





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




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


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
qqrq
post 16.04.2008, 08:05:50
Post #5





Grupa: Zarejestrowani
Postów: 418
Pomógł: 8
Dołączył: 16.11.2006

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


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?


--------------------
Go to the top of the page
+Quote Post
nevt
post 16.04.2008, 08:36:50
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


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


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
erix
post 16.04.2008, 08:47:32
Post #7





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




Cytat
a nie same nazwy plików?

A zajrzałeś chociaż do manuala?


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
hiszpanespaniol
post 17.04.2008, 01:12:03
Post #8





Grupa: Zarejestrowani
Postów: 213
Pomógł: 39
Dołączył: 7.04.2008
Skąd: 3city

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


@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

Ten post edytował hiszpanespaniol 16.04.2008, 12:26:08


--------------------
Go to the top of the page
+Quote Post
nevt
post 17.04.2008, 09:47:37
Post #9





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


  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


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
hiszpanespaniol
post 17.04.2008, 10:53:29
Post #10





Grupa: Zarejestrowani
Postów: 213
Pomógł: 39
Dołączył: 7.04.2008
Skąd: 3city

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


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

Ten post edytował hiszpanespaniol 17.04.2008, 10:58:36


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 7.07.2025 - 21:29