首页 / PHP / 帮忙看下这个递归文件夹函数哪里错了?
帮忙看下这个递归文件夹函数哪里错了?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了帮忙看下这个递归文件夹函数哪里错了?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3181字,纯文字阅读大概需要5分钟。
内容图文
![帮忙看下这个递归文件夹函数哪里错了?](/upload/InfoBanner/zyjiaocheng/242/0bc886d1898a45abab3fc7d627f83ff2.jpg)
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也会影响你的思维方式,先处理再输出的时候,你的注意力可以集中在当前的步骤上,而边处理边输出相当于一心二用。
内容总结
以上是互联网集市为您收集整理的帮忙看下这个递归文件夹函数哪里错了?全部内容,希望文章能够帮你解决帮忙看下这个递归文件夹函数哪里错了?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。