幫忙看下這個遞迴檔案夾函數哪裡錯了?

來源:互聯網
上載者:User
function foreach_dir($filename,$dir){    if(!is_dir($filename)) return;    $r = opendir($filename);    while($s = readdir($r)){        if($s != '.' && $s != '..'){            echo $s.'
'; // $dir .= $s.'
'; foreach_dir($filename.'/'.$s,$dir); } } return $dir;}echo foreach_dir('templates','');

輸出正確
default
images
index.html
top.jpg
menu
document.gif
documents.gif
index.html
sdocument.gif
sdocuments.gif
stylesheet.css
template.htm
subsilverlike

如果換成這樣

function foreach_dir($filename,$dir){    // $dir = '';    // echo $filename;    if(!is_dir($filename)) return;    $r = opendir($filename);    while($s = readdir($r)){        if($s != '.' && $s != '..'){            // echo $s.'
'; $dir .= $s.'
'; foreach_dir($filename.'/'.$s,$dir); } } return $dir;}echo foreach_dir('templates','');

輸出
default
subsilverlike

我這是把 echo $s.'
';換成了$dir .= $s.'
';顯示路徑就不完全了,哪裡錯了?

回複內容:

function foreach_dir($filename,$dir){    if(!is_dir($filename)) return;    $r = opendir($filename);    while($s = readdir($r)){        if($s != '.' && $s != '..'){            echo $s.'
'; // $dir .= $s.'
'; foreach_dir($filename.'/'.$s,$dir); } } return $dir;}echo foreach_dir('templates','');

輸出正確
default
images
index.html
top.jpg
menu
document.gif
documents.gif
index.html
sdocument.gif
sdocuments.gif
stylesheet.css
template.htm
subsilverlike

如果換成這樣

function foreach_dir($filename,$dir){    // $dir = '';    // echo $filename;    if(!is_dir($filename)) return;    $r = opendir($filename);    while($s = readdir($r)){        if($s != '.' && $s != '..'){            // echo $s.'
'; $dir .= $s.'
'; foreach_dir($filename.'/'.$s,$dir); } } return $dir;}echo foreach_dir('templates','');

輸出
default
subsilverlike

我這是把 echo $s.'
';換成了$dir .= $s.'
';顯示路徑就不完全了,哪裡錯了?

你熟讀一下你程式的邏輯就知道了,雖然你在迴圈中把$dir傳遞到了foreach_dir中進行遞迴,但是你沒有擷取和處理foreach_dir返回的$dir,所以最後你得到的也就是根目錄和其下一級檔案,沒有更進的目錄了。

程式應該是這樣的

function foreach_dir($filename, $dir){    if(!is_dir($filename)) return '';    $r = opendir($filename);    while ($s = readdir($r)) {        if($s != '.' && $s != '..') {            $dir .= $s.'
'; $dir .= foreach_dir($filename . '/' . $s, $dir); } } return $dir;}echo foreach_dir('templates','');

因為你把echo都注掉了,default和subsilverlike應該都是templates目錄下的第一級子目錄,是由語句$dir .= $s.'
'拼接出來了,實際上除了第一次調用函數外沒有任何內容被列印,所以就是這個結果了。你可以把你的第二段代碼的最後幾句修改成:

    echo $dir;}foreach_dir('templates','');

應該就能看到更多結果了。

不過兩段代碼的邏輯都很不清楚,我寫一段你看一下能明白不。

$details = [];function eachDir($dir, &$results) {    if (! is_dir($dir)) return false; //不是目錄就不需要處理了    $hd = opendir($dir);    while($file = readdir($hd)) {        if ($file == '.' || $file == '..') continue; //忽略這兩個目錄        $file = $dir . '/' . $file; //拼接完整的檔案名稱或路徑名        $results[] = $file; //放到遍曆結果中        if (is_dir($file)) eachDir($file, $results); //如果是目錄,遞迴處理    }    return true;}eachDir('templates', $details); //$details是通過傳址的方式處理的print_r($details);/** * 我期望的輸出類似 * templates/default * templates/detault/images * ... */

這個代碼沒測試。
不建議在函數中使用echo,就算是練習也一樣,因為echo出來的東西就無法被繼續處理了,所以應該盡量避免。同時echo也會影響你的思維方式,先處理再輸出的時候,你的注意力可以集中在當前的步驟上,而邊處理邊輸出相當於一心二用。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.