2014-10-29 101 views
1

我正在嘗試自動填充一組頁面,其中包含的內容由包含在設置文件夾結構中的內容自動生成。返回沒有回聲的函數結果PHP

我發現了一些代碼,這是大部分的方式,但我試圖修改它,以便它是一個函數,可以多次調用不同的文件夾。 原始代碼使用簡單的回聲,並不是一個函數。

我已經編輯它,並使其成爲一個函數,但我試圖弄清楚如何讓函數返回指定文件夾中的所有結果。

我使用這個功能:

function getDirContents($dir) { 
     date_default_timezone_set("Australia/Brisbane"); 
     $hide = "."; 
     if (!isset($_SERVER['QUERY_STRING']) || $_SERVER['QUERY_STRING'] == "" || substr($_SERVER['QUERY_STRING'],0,2) == ".." || strstr($_SERVER['QUERY_STRING'], "..")) { 
      $currdir = "$dir"; 
     } else { 
      $currdir = urldecode($_SERVER['QUERY_STRING']); 
     } 
     if ($currdir == "$dir") { 
      $label = "Root"; 
     } else { 
      $path = explode('/', $currdir); 
      $label = $path[count($path)-1]; 
     } 
     // Opens directory 
     $myDirectory = opendir($currdir); 
     // Gets each entry 
     while ($entryName = readdir($myDirectory)) { 
      $dirArray[] = $entryName; 
     } 
     // Closes directory 
     closedir($myDirectory); 
     // Counts elements in array 
     $indexCount = count($dirArray); 
     // Sorts files 
     //sort($dirArray); 
     // Loops through the array of files 
     for ($index = 0; $index < $indexCount; $index++) { 
      // Decides if hidden files should be displayed, based on query above. 
      if (substr("$dirArray[$index]", 0, 1) != $hide) { 
       // Resets Variables 
       $favicon = ""; 
       $class = "file"; 
       // Gets File Names 
       $name = $dirArray[$index]; 
       $namehref = ($currdir == "." ? "" : $currdir . '/') . $dirArray[$index]; 
       $fullname = $currdir . '/' . $dirArray[$index]; 
       // Gets Date Modified 
       $modtime = date("M j Y g:i A", filemtime($fullname)); 
       $timekey = date("YmdHis", filemtime($fullname)); 
       // Separates directories, and performs operations on those directories 
       if (is_dir($currdir . '/' . $dirArray[$index])) { 
        $extn = "&lt;Directory&gt;"; 
        $size = "&lt;Directory&gt;"; 
        $sizekey = "0"; 
        $class = "dir"; 
        // Gets favicon.ico, and displays it, only if it exists. 
        if (file_exists("$namehref/favicon.ico")) { 
         $favicon = " style='background-image:url($namehref/favicon.ico);'"; 
         $extn = "&lt;Website&gt;"; 
        } 
        // Cleans up . and .. directories 
        if($name=="."){$name=". (Current Directory)"; $extn="&lt;System Dir&gt;"; $favicon=" style='background-image:url($namehref/.favicon.ico);'";} 
        if($name==".."){$name=".. (Parent Directory)"; $extn="&lt;System Dir&gt;";} 

        if ($currdir == "." && $dirArray[$index] == "..") 
         $namehref = ""; 
        elseif ($dirArray[$index] == "..") { 
         $dirs = explode('/', $currdir); 
         unset($dirs[count($dirs) - 1]); 
         $prevdir = implode('/', $dirs); 
         $namehref = '?' . $prevdir; 
        } 
        else 
         $namehref = '?' . $namehref; 
       } 
       // File-only operations 
       else { 
        // Gets file extension 
        $extn = pathinfo($dirArray[$index], PATHINFO_EXTENSION); 
        // Prettifies file type 
        switch ($extn){ 
         case "png": $extn="PNG Image"; break; 
         case "jpg": $extn="JPEG Image"; break; 
         case "jpeg": $extn="JPEG Image"; break; 
         case "svg": $extn="SVG Image"; break; 
         case "gif": $extn="GIF Image"; break; 
         case "ico": $extn="Windows Icon"; break; 

         case "txt": $extn="Text File"; break; 
         case "log": $extn="Log File"; break; 
         case "htm": $extn="HTML File"; break; 
         //case "html": $extn="HTML File"; break; 
         case "xhtml": $extn="HTML File"; break; 
         case "shtml": $extn="HTML File"; break; 
         case "php": $extn="PHP Script"; break; 
         case "js": $extn="Javascript File"; break; 
         case "css": $extn="Stylesheet"; break; 

         case "pdf": $extn="PDF Document"; break; 
         case "xls": $extn="Spreadsheet"; break; 
         case "xlsx": $extn="Spreadsheet"; break; 
         case "doc": $extn="Microsoft Word Document"; break; 
         case "docx": $extn="Microsoft Word Document"; break; 

         //case "zip": $extn="ZIP Archive"; break; 
         case "htaccess": $extn="Apache Config File"; break; 
         case "exe": $extn="Windows Executable"; break; 

         default: if($extn!=""){$extn=strtoupper($extn);} else{$extn="Unknown";} break; 
        } 
        // Gets and cleans up file size 
        $size = pretty_filesize($fullname); 
        $sizekey = filesize($fullname); 

       } 
       $row = "<td><a href='$namehref'>$name ($extn, $size)</a> </td>"; 
       return $row; 
     } 
     } 
    } 

,然後用變量調用它像這樣

$Term1 = getDirContents('myFolder/Structure/'); 
echo $term1; 

這打印出的文件夾中的第一個文件卻不能爲生活我我想出瞭如何把它列出來。

我的理解是,當你在一個函數中使用return函數時,它會停止函數,不應該在for循環中重新運行它嗎?

我覺得這裏有一些非常基本的東西,我很想念你,所以你的幫助非常感謝。

+0

首先要做的就是將'return'語句移出循環。你也想追加到你的結果('$ row')而不是直接分配。我建議你使用一個數組 – Phil 2014-10-29 03:11:22

+0

而不是在循環中調用return,將'$ row'附加到另一個變量(例如'$ return')並在循環後返回該變量! – wolfgangwalther 2014-10-29 03:12:04

+1

我認爲集中一個字符串('$ return。= $ row')在這裏比使用數組更容易 – wolfgangwalther 2014-10-29 03:14:20

回答

0

一個非常簡單的解決方法是更改​​如何分配錶行字符串以將下一行附加到保留變量$row(與.=),然後將return移動到循環外部。

我不打算複製整個代碼,但最後幾行看起來像這樣;

  $row .= "<td><a href='$namehref'>$name ($extn, $size)</a> </td>"; 
      // deleted 'return $row;' and moved to below 
    } 
    } 
    return $row; 
} 

希望這會有所幫助。

PS:因爲我們將字符串追加到$row,所以最好在函數的頂部初始化它以確保在內存中已經沒有$row的值。爲此,只需編寫$row = '';(即將其設置爲空字符串)。

+0

您還應該初始化循環上方的$ row變量,否則這將在第一個循環迭代 – Phil 2014-10-29 03:24:44

+0

@Phil有趣時觸發「E_NOTICE」級錯誤。我從來沒有遇到過這個問題,那就是所有的錯誤報告都被打開了 - 但我向你更好的判斷。 – worldofjr 2014-10-29 03:27:03

+0

認真嗎?你確定你沒有用'E_ALL^E_NOTICE'運行錯誤報告?在這裏看到示例〜https://eval.in/211142 – Phil 2014-10-29 03:31:29