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','');
输出正确
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.'<br>';
$dir .= $s.'<br>';
foreach_dir($filename.'/'.$s,$dir);
}
}
return $dir;
}
echo foreach_dir('templates','');
输出
default
subsilverlike
我这是把 echo $s.'
';换成了$dir .= $s.'
';显示路径就不完全了,哪里错了?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
你熟读一下你程序的逻辑就知道了,虽然你在循环中把
$dir传递到了foreach_dir中进行递归,但是你没有获取和处理foreach_dir返回的$dir,所以最后你得到的也就是根目录和其下一级文件,没有更进的目录了。程序应该是这样的
因为你把echo都注掉了,default和subsilverlike应该都是templates目录下的第一级子目录,是由语句$dir .= $s.'
'拼接出来了,实际上除了第一次调用函数外没有任何内容被打印,所以就是这个结果了。你可以把你的第二段代码的最后几句修改成:
应该就能看到更多结果了。
不过两段代码的逻辑都很不清楚,我写一段你看一下能明白不。
这个代码没测试。
不建议在函数中使用echo,就算是练习也一样,因为echo出来的东西就无法被继续处理了,所以应该尽量避免。同时echo也会影响你的思维方式,先处理再输出的时候,你的注意力可以集中在当前的步骤上,而边处理边输出相当于一心二用。