Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wiele return w funkcji a zwraca tylko jeden
Forum PHP.pl > Forum > PHP
nitro18
Mam kod który oblicza objętość folderów z podfolderami z plikami

  1. <?php
  2. function policz($sciezka) {
  3. if (!is_dir($sciezka)) return 0;
  4. $katalog = opendir($sciezka);
  5. while (false !== ($plik = readdir($katalog))) {
  6. if ($plik<>"." and $plik<>"..") {
  7. $f = "$sciezka/$plik";
  8. if (is_dir($f)){
  9.  $wielkosc+=policz($f);
  10.  $katalogi_licz=$katalogi_licz+1;
  11. } else{
  12.  $wielkosc+=filesize($f);
  13. $pliki_licz=$pliki_licz+1;
  14. }
  15. }
  16. }
  17. closedir($katalog);
  18. return $wielkosc;
  19. return $katalogi_licz;
  20. return $pliki_licz;
  21. }
  22. ?>


objętość danego folderu jest zwracana przez return $wielkosc.

Dodałem jeszcze do tej funkcji obliczanie ile jest plików i folderów w tym folderze.
Liczba plików ma być zwracana przez return $pliki_licz a liczba folderów - return $katalogi_licz

Tylko jest jedno ale. Funkcja zwraca mi tylko wielkość folderu i jak przeczytałem w dokumentacji php.net kończy działanie funkcji przez co nie zwraca liczby plików i folderów.

W jaki sposób zwrócić dwie ostatnie zmienne?

Wie ktoś może jak to naprawić?
Cienki1980
  1. <?php
  2. $tab['wielkosc']=$wielkosc;
  3. $tab['katalogi_licz']=$katalogi_licz;
  4. $tab['pliki_licz']=$pliki_licz;
  5.  
  6. return $tab;
  7. ?>

Zwracasz tablicę i po wywołaniu funkcji odczytujesz dane prosto z niej.
nitro18
Pisze mi:
Fatal error: Unsupported operand types in C:\serwer\users\browser\index.php on line 11

choć dodałem tak jak napisałeś.


później jak chce wywołać:

$tab=policz($sciezka."/".$katalogi[$i]);

echo $tab['wielkosc'];

ale też nie działa.
Cienki1980
Dziwne .. skoro wcześniej funkcja działała a nie zmieniłeś nic ważnego w samej funkcji.

A spróbuj zmienić tak aby funkcja zwracała pojedyncze wartości i zobacz czy będzie dla każdej działała. Jak dla mnie powinno działać zwracając tablicę tak samo dobrze jak zwracając pojedynczą wartość.
nitro18
ogólnie to jest mi potrzebne bo buduje menagera plikow na potrzeby mojego panela.

Podaje Wam pełny kod nieskończony więc tylko patrzcie tam gdzie te zmienne chce wrócić a reszta jest w fazie rozwoju biggrin.gif (oj, wiem że namieszane, ale trudno).

  1. <?
  2. $setup=$_GET['setup'];
  3. $dir=$_GET['dir'];
  4. function policz($sciezka) {
  5. if (!is_dir($sciezka)) return 0;
  6. $katalog = opendir($sciezka);
  7. while (false !== ($plik = readdir($katalog))) {
  8. if ($plik<>"." and $plik<>"..") {
  9. $f = "$sciezka/$plik";
  10. if (is_dir($f)){
  11. $wielkosc+=policz($f);
  12. $katalogi_licz=$katalogi_licz+1;
  13. } else{
  14. $wielkosc+=filesize($f);
  15. $pliki_licz=$pliki_licz+1;
  16. }
  17. }
  18. }
  19. closedir($katalog);
  20. return $wielkosc;
  21. return $katalogi_licz;
  22. return $pliki_licz;
  23. }
  24.  
  25. if($setup==""){
  26. $sciezka="../a/";
  27. $sciezka=$sciezka.$dir;
  28.  
  29. $f = opendir($sciezka);
  30. while (false !== ($plik = readdir($f))) {
  31. if ($plik<>"." and $plik<>"..") {
  32. if (is_dir($sciezka."/".$plik)) $katalogi[] = $plik;
  33. else $pliki[] = $plik;
  34. }
  35. }
  36. closedir($f);
  37.  
  38. @sort($katalogi);
  39. @sort($pliki);
  40. ?>
  41.  
  42. <?
  43. $foldery[]=explode("/", $dir);
  44. $ile= count($foldery[0]);
  45.  
  46. echo "<a HREF=\"?dir=\">Katalog Główny</A>";
  47. for($i=0;$i<$ile;$i++){
  48. $folderys.=$foldery[0][$i]."/";
  49. $folderyss=substr($folderys,0,-1);
  50. echo "<a HREF=\"?dir=".$folderyss."\">".$foldery[0][$i]."/</A> ";
  51. }
  52. ?>
  53. <BR>
  54. <BR>
  55. <BR>
  56.  
  57.  
  58. <table border=1 width="100%">
  59. <tr>
  60. <td> </TD><th>Nazwa</TH><th>Typ</TH><th>Rozmiar</TH><td> </TD>
  61. </TR>
  62. <?
  63. for($i=0;$i<count($katalogi);$i++){
  64. ?>
  65. <tr>
  66. <td style="width:25px;"><img SRC="type/folder.gif"></TD>
  67. <td><a HREF="?dir=<?echo $dir."/".$katalogi[$i];?>"><?echo $katalogi[$i]; ?></A></TD>
  68. <td>folder plików</TD>
  69. <td>
  70. <?
  71. $size=policz($sciezka."/".$katalogi[$i]);
  72.  
  73. if($size<1024){
  74. echo $size." bajtów (".$pliki_licz;
  75. }elseif(($size>=1024)&&($size<2048)){
  76. echo $size/1024;
  77. echo "-".$pliki_licz;
  78. }
  79.  
  80.  
  81.  
  82. ?>
  83. </TD>
  84. <td></TD>
  85.  
  86. </tr>
  87.  
  88. <?
  89. }
  90.  
  91. ?>
  92.  
  93. <?
  94. /*
  95. for($i=0;$i<count($pliki);$i++){
  96. echo $pliki[$i]."-----".filesize($sciezka."/".$pliki[$i])."<br>";
  97. }
  98.  
  99.  
  100.  
  101. */
  102. }
  103.  
  104. ?>
  105. <BR>
  106. <BR>
  107. <BR>
  108. <BR>
  109. <BR>
  110. <BR>
  111. <?
  112. $file="jarek.malpa.pl.cos.pl.a.s.f.g.s.w..t.sd.d.f.e.s.=.d.d.d.-.jpg";
  113. $ex=explode(".", $file);
  114.  
  115. $ile_ex=count($ex);
  116. $roz=$ex[$ile_ex-1];
  117.  
  118. unset($roz);
  119. $rozp="union";
  120.  
  121.  
  122. $roz[jpg]="JPG";
  123. $roz[gif]="GIF";
  124. $roz[exe]="EXE";
  125.  
  126. //if(isset($roz[$rozp]))echo 'ok';
  127. ?>
Cienki1980
Jest OK biggrin.gif
Zwróć uwagę, że wewnątrz funkcji policz() wywołujesz funkcję policz();

Jeżeli zmieniłeś to co zwraca funkcja, musisz przystosować jej wywołanie wewnątrz funkcji, np tak:
  1. <?php
  2. function policz($sciezka)
  3. {
  4.  if (!is_dir($sciezka))
  5. return 0;
  6.  
  7.  $katalog = opendir($sciezka);
  8.  while (false !== ($plik = readdir($katalog)))
  9.  {
  10. if ($plik<>"." and $plik<>"..")
  11. {
  12.  $f = "$sciezka/$plik";
  13.  if (is_dir($f))
  14.  {
  15. $x=policz($f);
  16. $wielkosc+=$x['wielkosc'];
  17. $katalogi_licz=$katalogi_licz+1;
  18.  }
  19.  else
  20.  {
  21. $wielkosc+=filesize($f);
  22. $pliki_licz=$pliki_licz+1;
  23.  }
  24. }
  25.  }
  26.  closedir($katalog);
  27.  $tab['wielkosc']= $wielkosc;
  28.  $tab['kat']= $katalogi_licz;
  29.  $tab['plik']= $pliki_licz;
  30.  return $tab;
  31. }
  32. ?>

Mi ta wersja zabanglała.
nitro18
tak jest bo jest rekurencyjnie czy jak to się nazywa.
ten przykład wziąłem z algorytmy.pl
revyag
A może skorzystać z dobrodziejstw php5 i spl ? smile.gif
  1. <?php
  2. function GetSize($sDir) {
  3. $oIter = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($sDir),true);
  4. $iSize = 0;
  5. foreach($oIter as $sFile) {
  6. if($sFile->isFile()) {
  7. $iSize += $sFile->getSize();
  8. }
  9. }
  10. echo $iSize;
  11. }
  12. ?>

Wyświetla wielkość wszystkich plików w danym katalogu (wliczają jego podkatalogi)
NuLL
  1. <?php
  2. $size=0;
  3. foreach(glob('katalog/*.*) as $f)) $size+=filesize($f);
  4. echo $size;
  5. ?>
snitch.gif
nitro18
Dziękuję, dziękuję.

Dzięki za skrypt revyag. Przeczytałem dodatkowo w manualu o SPL i stworzyłęm krócej liczenie plików i katalogów.

A oto efekt mojej pracy, manager plików

+ wyświetla ikonki dla 169 rodzajów plików
+ podgląd pliku dla 17 rozszerzeń
+ łatwe tworzenie folderu w aktualnym folderze którym jesteś
+ usuwasz folder -> usuwasz automatycznie od razu pliki i foldery które są w nim
+ upload do 5 plików, rozmiar pliku dyktuje serwer

Zobaczcie, spróbujcie, oceńcie.
Turgon
http://www.eip.ovh.org/browser/?dir=/jarek/../../../
Zabezpiecz to biggrin.gif
nitro18
poprawiony. sprawdź. jeszcze jakieś błędy?
Spirit86
no jasne, wgrywanie plików, wgrałem sobie plik php panie Jarku M....
nitro18
dodano funkcję sprawdzającą czy rozszerzenie pliku któy ma być wysłany na serwer jest na liście zakazanej biggrin.gif
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.