2014-10-29 56 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