首页 > 后端开发 > php教程 > 帮忙看下这个递归文件夹函数哪里错了?

帮忙看下这个递归文件夹函数哪里错了?

WBOY
发布: 2016-06-06 20:15:23
原创
833 人浏览过

<code>function foreach_dir($filename,$dir){
    if(!is_dir($filename)) return;

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


echo foreach_dir('templates','');</code>
登录后复制
登录后复制

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

如果换成这样

<code>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.'<br>';
            $dir .= $s.'<br>';
            foreach_dir($filename.'/'.$s,$dir);
        }
        
    }
    return $dir;
}


echo foreach_dir('templates','');</code>
登录后复制
登录后复制

输出
default
subsilverlike

我这是把 echo $s.'
';换成了$dir .= $s.'
';显示路径就不完全了,哪里错了?

回复内容:

<code>function foreach_dir($filename,$dir){
    if(!is_dir($filename)) return;

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


echo foreach_dir('templates','');</code>
登录后复制
登录后复制

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

如果换成这样

<code>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.'<br>';
            $dir .= $s.'<br>';
            foreach_dir($filename.'/'.$s,$dir);
        }
        
    }
    return $dir;
}


echo foreach_dir('templates','');</code>
登录后复制
登录后复制

输出
default
subsilverlike

我这是把 echo $s.'
';换成了$dir .= $s.'
';显示路径就不完全了,哪里错了?

你熟读一下你程序的逻辑就知道了,虽然你在循环中把$dir传递到了foreach_dir中进行递归,但是你没有获取和处理foreach_dir返回的$dir,所以最后你得到的也就是根目录和其下一级文件,没有更进的目录了。

程序应该是这样的

<code>function foreach_dir($filename, $dir)
{
    if(!is_dir($filename)) return '';

    $r = opendir($filename);
    while ($s = readdir($r)) {
        if($s != '.' && $s != '..') {
            $dir .= $s.'<br>';
            $dir .= foreach_dir($filename . '/' . $s, $dir);
        }
        
    }
    return $dir;
}


echo foreach_dir('templates','');</code>
登录后复制

因为你把echo都注掉了,default和subsilverlike应该都是templates目录下的第一级子目录,是由语句$dir .= $s.'
'拼接出来了,实际上除了第一次调用函数外没有任何内容被打印,所以就是这个结果了。你可以把你的第二段代码的最后几句修改成:

<code>    echo $dir;
}
foreach_dir('templates','');</code>
登录后复制

应该就能看到更多结果了。

不过两段代码的逻辑都很不清楚,我写一段你看一下能明白不。

<code>$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
 * ...
 */</code>
登录后复制

这个代码没测试。
不建议在函数中使用echo,就算是练习也一样,因为echo出来的东西就无法被继续处理了,所以应该尽量避免。同时echo也会影响你的思维方式,先处理再输出的时候,你的注意力可以集中在当前的步骤上,而边处理边输出相当于一心二用。

相关标签:
php
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板