Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: funkcja globe()
Forum PHP.pl > Forum > PHP
ats2008
Witajcie.

Pomóżcie, bo męczę się i głupieję już smile.gif, a czas leci.

Robię galerię zdjęć, która przy użyciu funkcji glob() i pętli foreach wyświetla zdjecia.

Problem polega jednak na tym, że będą różne galerie (ich ilość będzie zmienna), w których zdjęcia będą ładowane z różnych katalogów, np. gallery1, gallery2, gallery3, etc. Kasuję folder, nie ma galerii... dadaje folder jest nowa galeria...

Wpadłem na pomysł, żeby użyć zagnieżdżonej pętli foreach z użyciem 2 funkcji glob() 1 - do katalogów (odpowiedniki folderów) i 2 konkretnych zdjęć.

Udało mi się bez problemu wyświetlić katalogi, ale mam problem poprawnym zapisem, żeby wyświetlały się zdjęcia same zdjęcia.

Kod:
  1. <?php
  2. $folder = glob('test/*', GLOB_ONLYDIR);
  3.  
  4. foreach ($folder as $file)
  5. {
  6. echo '<div id="gallery_'.$file.'">
  7. <div class="gallery_show_1">';//wyświetla kontentenery dla galerii - bardzo ładnie
  8.  
  9. $lista = glob('$file'); /* nie wiem, co tu wstawićtu jest problem, próbowałem chyba wszystkiego nie wyświetla tej pętli. do pojedynczego katalogu wyświetla (np. glob('test/test1/*.*'), ale żeby podmieniał ścieżkę dynamicznie?*/
  10. foreach ($lista as $files)
  11. {
  12. echo '<img src="'.$file.'/'.$files.'" />';
  13. }
  14. echo '</div></div>';
  15. }
  16. ?>


Chodzi o zapis $lista = glob(questionmark.gif?); - już głupieję.

Co byście mi doradzili panowie w tej sprawie?

Z góry dzięki.
flashdev
Cytat(ats2008 @ 15.12.2010, 01:00:30 ) *
Co byście mi doradzili panowie w tej sprawie?

Z góry dzięki.


Napisz sobie rozszerzenie funkcji globe. Funkcja która będzie korzystać z mechanizmu rekurencji, a będzie zwracać ścieżki do wszystkich plików z podanego katalogu i pasujących do wzorca.
darko
Nie wiem czy dobrze rozumiem Twój problem, chodzi o wyświetlanie pod katalogów podkatalogów? Spróbuj iteratorem:
  1. $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('/test/'));
  2. foreach($it as $k => $v)
  3. {
  4. echo $k . ' => ' . $v . '<br/>';
  5. }
ats2008
Witaj.

Chodzi o to, żeby funkcja zwróciła zapis odpowiadający katalogom:
test //katalog z galeriami
- 1 podkatalog (test/test1)
ścieżka dostępu do zdjęcia 1 (test\test1\w3c.jpeg)
ścieżka dostępu do zdjęcia 1
- 2 podkatalog (test/test2)
zdjęcie 1, 2, 3.... itd.

Twój kod z użyciem iteratora znacznie sprawę przybliżył. Przerobiłem to delikatnie:
  1. $folder = glob('test/*', GLOB_ONLYDIR);
  2. foreach ($folder as $file)
  3. {
  4. echo '<div id="gallery_'.$file.'">
  5. <div class="gallery_show_1">';//wyświetla kontentenery dla galerii - bardzo ładnie
  6. echo $file.'<br />';
  7. $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('test/'));
  8. foreach($it as $k => $v)
  9. {
  10. echo $v . '<br/>';
  11. }}

pętle wyświetlają się pięknie, ale w każdej iteracji wyświetla ciurkiem wszystkie zdjecia.
Galeria1:
test\test1\w3c.jpeg
test\test1\w3cHTML.png
test\test2\w3c.jpeg
test\test3\w3c.jpeg
test\test4\w3cHTML.png
test\test5\w3ccss21.png

Galeria2 i reszta, to samo.

O te ścieżki dostępu chodziło, ale jak je podzielić na kategorie podkatalogów?

Z góry dzięki
Noidea
Cytat(ats2008 @ 15.12.2010, 01:00:30 ) *
komentarz:
do pojedynczego katalogu wyświetla (np. glob('test/test1/*.*'), ale żeby podmieniał ścieżkę dynamicznie?


Żeby podmieniał dynamicznie, to zamieniasz "test1" z powyższego przykładu na zawartość zmiennej $file.

RecursiveIterator to trochę inne podejście. Wystarczy mu tylko jedna pętla foreach, w której sprawdzasz czy aktualnie sprawdzany element jest katalogiem. Jeśli tak, to wszystkie następne elementy typu "plik" są zdjęciami w tym katalogu (w tej galerii), aż do napotkania następnego elementu, który jest katalogiem, itd. Z tego co widzę po kodzie jeszcze średnio łapiesz iteratory, więc radzę zostać przy glob()

PS. Jakbym tak nazywał zmienne jak ty, to też bym się gubił smile.gif
ats2008
hej,

Dzięki Noidea - wiedziałem od początku, że rypnąłem się w składni parametru funkcji glob. Faktycznie zapis glob($file.'/*.*') spowodował wyświetlenie zawartości smile.gif.

Daję gotowca - może się komuś przyda (z normalnymi zmiennymi).
  1. <?php
  2. $folder = glob('test/*', GLOB_ONLYDIR);
  3. foreach ($folder as $folder_name)//zapamiętuje nazwy podkatalogów katalogu test/
  4. {
  5. echo '<div id="gallery_'.$folder_name.'">
  6. <div class="gallery_show_1">';
  7.  
  8. $lista = glob($folder_name.'/*.*'); //zapamiętuje zdjęcia
  9. foreach ($lista as $foto)
  10. {
  11. echo '<img src="'.$foto.'" />';//wyświetlenie zdjecia
  12. }
  13.  
  14. echo '</div></div>';
  15. }
  16.  
  17.  
  18. ?>


Pozdrawiam.


Mam jeszcze jeden problem - tym razem z zamianą ciągu znaków.

używam funkcji preg_replace do zamiany ciągu: "test/test1" na ciąg: "test1";

  1. $folder = glob('test/*', GLOB_ONLYDIR);
  2. foreach ($folder as $folder_name)//zapamiętuje nazwy podkatalogów katalogu test/
  3. {
  4. $tekst = $folder_name;
  5. $tekst = preg_replace ( '/^[a-z]\[a-zA-Z0-9]$/' , '/^[a-zA-Z0-9]$/' , $tekst);
  6.  
  7. echo '<span id="name_'.$tekst.'">'.$tekst.' </span> ';
  8. }

Gdzie popełniłem błąd?
  1. preg_replace ( '/^[a-z]\[a-zA-Z0-9]$/' , '/^[a-zA-Z0-9]$/' , $tekst)

, bo ta funkcja nie skraca ciągu, tylko wyświetla w całości. Patrzyłem na wzorce w necie, ale chyba samo wyrażenie jest złe (nie jestem w tym zbyt mocny wstydnis.gif ).

To już ostatni mój problem smile.gif.

Z góry dzięki.
jang
Jeśli ciągle kasujesz ten sam tekst to masz 2 przykłady :
  1. $test = 'test/test1';
  2. $test = ltrim($test, "test");
  3. $test = ltrim($test, "/");
  4. echo $test;
  5.  
  6. echo "<br /><br />";
  7.  
  8. $test = 'test/test1';
  9. $test = substr($test, 5);
  10. echo $test;
ats2008
Dzięki panowie za pomoc smile.gif.

W międzyczasie znalazłem jeszcze coś takiego: $b = explode ("/", $tekst); Też działa.

Tak to jest z początkami smile.gif

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