Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Funkcja
Forum PHP.pl > Forum > PHP
xokisx
Znalazłem w necie skrypt który wyświetla listy plików z określonego katalogu, oto ten skrypt:
Kod
<?php
  $i = 0;
  $images['file'] = "<img src=\"img/doc.gif\"> ";
  $images['dir'] = "<img align=\"center\" src=\"img/folder.gif\"> ";

  function show_dir($directory)
  {
      global $i, $images;

      $dir = opendir($directory);
      while ( $file = readdir($dir) )
      {
          if ( $file != "." && $file != ".." )
          {
              if ( is_dir($directory."/".$file) )
              {
                  echo ( str_repeat("&nbsp;", $i * 2) . $images['dir'] .  $file . "<br />" );
                  ++$i;
                  show_dir($directory . "/" . $file);
              }
              else
              {
                  echo ( str_repeat("&nbsp;", $i * 3) . $images['file'] . $file . "<br />" );
              }
          }
      }
      closedir($dir);
      --$i;
  }
  show_dir("./../../");
?>

Mógłby mi ktoś przerobić ten skrypt tak aby nie był w postaci funkcji a normalnego kodu ?
mike
Nie da się ponieważ potrzeba wykorzystać rekurencję, której nie osiągniesz bez zamyania częci kodu w funkcję.
xokisx
A jak można by przerobić ten kod aby dał podobny efekt i nie był funkcją ?
mike
A dlaczego nie chcesz funkcji? Przeciez to taka sama konstrukcja języka jak inne.
Prośba nie ma sensu, równie dobrze mógłbyś prosić o przerobienie bez wykorzystywania pętli.\
Funkcje to też "normalny" kod.
1010
Ale nie rozumiem dlaczego to nie może być funkcja? Czy tak nie jest wygodniej?

@mike gdzie Ty tam widzisz rekurencje?
pyro
Cytat(1010 @ 28.07.2008, 13:11:58 ) *
Ale nie rozumiem dlaczego to nie może być funkcja? Czy tak nie jest wygodniej?

@mike gdzie Ty tam widzisz rekurencje?


a tutaj slepaku

  1. <?php
  2. show_dir($directory . "/" . $file);
  3. ?>


// Wyrażaj się.
// ~webdicepl
1010
Rzeczywiście pyro smile.gif przegapiłem biggrin.gif Wybaczcie...
kampio
show_dir($directory . "/" . $file); to jest odwołanie do rekurencji biggrin.gif
mike
  1. <?php
  2.  
  3. $dirImg = '<img src="dir.gif" />';
  4. $docImg = '<img src="doc.gif" />';
  5.  
  6. $dirIterator = new RecursiveDirectoryIterator('.');
  7. $iterator = new RecursiveIteratorIterator($dirIterator, RecursiveIteratorIterator::SELF_FIRST);
  8. foreach ($iterator as $item) {
  9. /* @var $item SplFileInfo */
  10. if (!$iterator->isDot()) {
  11. echo str_repeat(' - ', $iterator->getDepth());
  12. if ($item->isDir()) {
  13. echo $dirImg;
  14. } else {
  15. echo $docImg;
  16. }
  17. echo $item->getFilename() . '<br />';
  18. }
  19. }
  20.  
  21. ?>


Masz bez funkcji, tylko nie narzekaj że z klasami tongue.gif bo innej możliwości nie ma.
zimi
Cytat
Nie da się ponieważ potrzeba wykorzystać rekurencję, której nie osiągniesz bez zamyania częci kodu w funkcję.

a o derekursywacji nikt nie słyszał?O.o
mike
~zimi słyszał, słyszał. W o ograniczeniach PHP słyszałeś? Piwo masz ode mnie jak zaimplementujesz to bez rekurencji w PHP.
Kicok
Cytat("mike")
~zimi słyszał, słyszał. W o ograniczeniach PHP słyszałeś?


A można wiedzieć o jakie ograniczenia chodzi? Zaciekawiło mnie to. Do tego stopnia, że postanowiłem napisać listowanie zawartości katalogu iteracyjnie i o dziwo się udało
mike
Cytat(Kicok @ 28.07.2008, 20:50:27 ) *
A można wiedzieć o jakie ograniczenia chodzi? Zaciekawiło mnie to. Do tego stopnia, że postanowiłem napisać listowanie zawartości katalogu iteracyjnie i o dziwo się udało
Pochwal się.
zimi
lol, @Kicok odczep się biggrin.gif:P moje piwo smile.gif
  1. <?php
  2. function pisaneDlaPiwa($sciezka)
  3. {
  4. $poziom = -1;
  5. $poziom++;
  6. $sciezki[$poziom] = $sciezka;
  7. $zaglebienie[$poziom] = opendir($sciezki[$poziom]);
  8. while($poziom >= 0)
  9. {
  10. while($plik = readdir($zaglebienie[$poziom]))
  11. {
  12. if(!in_array($plik, array('.','..')))
  13. {
  14. echo str_repeat('&nbsp;', $poziom*4).$plik.'<br>';
  15. $nowaSciezka = $sciezki[$poziom].'/'.$plik;
  16. if(is_dir($nowaSciezka))
  17. {
  18. $poziom++;
  19. $sciezki[$poziom] = $nowaSciezka;
  20. $zaglebienie[$poziom] = opendir($sciezki[$poziom]);
  21. }
  22. }
  23. }
  24. $poziom--;
  25. }
  26. }
  27. pisaneDlaPiwa('.');
  28. ?>


@mike jak już powiesz co to za ograniczenia O.o
to wpadnij z browcem na bulwar w Gdyni biggrin.gif:P

edit: jak się napiszę na kilka sposobów będzie cała skrzynka?biggrin.gif:P
mike
~zimi jak napiszesz bez rekurencji coś co przegląda cały folder zagnieżdżając się w dół, czyli zawartość folderów się w nim znajdujących i folderów w tych folderach, itd to wpadnę do Gdyni.
Kicok
Cytat("mike")
Pochwal się.

  1. <pre>
  2. <b>c:/usr/</b>
  3. <?php
  4.  
  5. $directiries = array();
  6.  
  7. $directories[0]['dirname'] = 'c:/usr/';
  8. $directories[0]['pointer'] = opendir( 'c:/usr/' );
  9. $level = 1;
  10.  
  11.  
  12. while( true )
  13. {
  14. $file = readdir( $directories[0]['pointer'] );
  15.  
  16. if( !$file )
  17. {
  18. closedir( $directories[0]['pointer'] );
  19. array_shift( $directories );
  20.  
  21. if( !--$level )
  22. {
  23. break;
  24. }
  25. }
  26. elseif( $file != '.' && $file != '..' )
  27. {
  28. echo str_repeat( ' ', $level * 2 ) . $file . "\n";
  29.  
  30. if( is_dir( $directories[0]['dirname'] . $file ) )
  31. {
  32. ++$level;
  33.  
  34. array_unshift( $directories, array() );
  35. $directories[0]['dirname'] = $directories[1]['dirname'] . $file . '/';
  36. $directories[0]['pointer'] = opendir( $directories[0]['dirname'] ); 
  37. }
  38. }
  39. }
  40.  
  41. ?>
  42. </pre>


Proszę. Tablica $directories działa tutaj jak stos ( Nie wiem od której wersji działa "prawdziwy stos" - SPLStack - pewnie 5.3 albo 6.0 )

W sumie zasada działania podobna jak u zimi'ego
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.