欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

请大神帮我看看这两段代码有什么不同。为什么输出的结果不一样

程序员文章站 2022-06-02 13:29:14
...
/**
* 遍历目录和子目录及文件
* @param string $dir
* @param int $level
*
*/

function scan_dir($dir = ".",$level = 0 ){
//判断当前路径是不是文件,如果是直接返回
static $arr = array();
if(!is_dir($dir)){
$arr[] = array(
'file' => $dir,
'level' => $level,
'type' => 'file'
);
//echo ''.$dir.'' .'
';
return;
}
//2打开目录资源
$resorc = opendir($dir);
if(!$resorc){
exit('目录打开失败');
}

//3循环遍历目录
while ($file = readdir($resorc)){

//var_dump($file); die();
//排除.和..
if ($file ==='.' || $file ==='..'){
//什么也不做
}else{
//否则就是一个文件或文件夹
//组成一个完整的路径
$path = $dir.'/'.$file;
//var_dump($path);exit();
//判断是否是一个文件
if(is_file($path)){
var_dump($path);echo '1
';
//输出文件
$arr[] = array(
'file' => $file,
'level' => $level,
'type' => 'file'
);

//echo str_repeat(" ",$level).''.$file.''.'
' ;
}else {
//输出文件夹名字
$arr[] = array(
'dir' => $dir,
'level' => $level,
'type' => 'dir'
);
//echo str_repeat(" ",$level).''.$dir.''.'
' ;
//否则是一个目录 然后递归调用函数 深层次的遍历当前遍历到的目录

scan_dir($path,$level+1);

}
}

}
return $arr;

}
$arr = scan_dir(); echo '
';
//var_dump($arr);
foreach ($arr as $value){
if($value['type'] == 'file'){
//var_dump($value['file']);
echo str_repeat(" ",$value['level']).''.$value['file'].'
';
}else{
echo str_repeat(" ",$value['level']).''.$value['dir'].'
';
}
}
输出的结果如下:
就是当前目录及子目录的文件名和目录名
digui.php
.
a.php
./sbuscan / / 这个目录下面还有一个叫subc 的目录没有输出,但是这个subc目录下面的subc.php 文件却输出了
subc.php
test.txt


请看下面的代码 我几乎是照着写的。
function myScandir($dir = ".",$level = 0){
//保存所有遍历到的文件和文件夹,要能区分父子关系
static $arr = array();
//1. 判断当前路径是否是一个目录,如果不是目录则直接返回当前文件
if(!is_dir($dir)){
//蓝色输出当前文件
//echo '' . $dir . '
';
//为了能够区分当前文件属于哪一层,使用$level来记录
$arr[] = array('level' => $level,'filename' => $dir,'type' => 'file');
//停止执行
//return 不一定需要返回值
return;
}

//2. 获取目录资源
$o = opendir($dir);

//目录打开失败处理
if(!$o){
exit('目录打开失败');
}

//3. 循环遍历目录
while($filename = readdir($o)){
//去除 . 和 ..两个文件夹
if($filename == '.' || $filename == '..'){
//什么都不干
}else{
//核心代码
//一个正常的文件:有可能是文件夹也有可能是文件
//20140622/son
//将当前遍历到的文件组成一个完整的路径
$file_dir = $dir . '/' . $filename;

//判断文件类型
if(is_file($file_dir)){
//var_dump($file_dir);echo '2
';
//是一个文件
//使用str_repeat()重复输出多个空格
//echo str_repeat(" ",$level),'' . $filename . '
';
$arr[] = array('level' => $level,'filename' => $filename,'type' => 'file');
}else{
//输出当前文件夹名字
//echo str_repeat(" ",$level),'' . $filename . '
';
$arr[] = array('level' => $level,'filename' => $filename,'type' => 'dir');
//是一个文件路径,需要进入到该路径进行深层次的遍历
//递归调用自己,把路径改成当前遍历到的目录
myScandir($file_dir,$level + 1);
// var_dump($file_dir);
}
}
}

//返回最终遍历到的数组
return $arr;
}

//return跟函数调用出是否要用变量接收没有必然关系
//如果函数没有return,就不能定义变量接收(没有意义)
$arr = myScandir();

//遍历数组,按照文件蓝色输出,文件夹红色数组,分清楚父子关系
foreach($arr as $value){
//每个$value都代表一个文件,所属哪个具体层级,到底是文件还是文件夹
if($value['type'] == 'dir'){
//当前文件是文件夹
echo str_repeat(" ",$value['level']),'' . $value['filename'] . '
';
}else{
//是一个文件
echo str_repeat(" ",$value['level']),'' . $value['filename'] . '
';
}
}

这段代码输出如下 : 是我想要的结果
digui.php
sbuscan
a.php
sbuc // 这里subc目录输出来了 我上面那段代码为什么没有输出。
subc.php
test.txt


回复讨论(解决方案)

你加点调试信息

      //判断是否是一个文件      if(is_file($path)){        //var_dump($path);echo  '1
'; //输出文件 $arr[] = array('path' => $path, 'file' => $file, 'level' => $level, 'type' => 'file' ); //echo str_repeat(" ",$level).''.$file.''.'
' ; }else { //输出文件夹名字 $arr[] = array('path' => $path, 'dir' => $dir, 'level' => $level, 'type' => 'dir' ); //echo str_repeat(" ",$level).''.$dir.''.'
' ; //否则是一个目录 然后递归调用函数 深层次的遍历当前遍历到的目录 scan_dir($path,$level+1); }
最后 printr($arr); 就可以看到问题所在了

你加点调试信息

      //判断是否是一个文件      if(is_file($path)){        //var_dump($path);echo  '1
'; //输出文件 $arr[] = array('path' => $path, 'file' => $file, 'level' => $level, 'type' => 'file' ); //echo str_repeat(" ",$level).''.$file.''.'
' ; }else { //输出文件夹名字 $arr[] = array('path' => $path, 'dir' => $dir, 'level' => $level, 'type' => 'dir' ); //echo str_repeat(" ",$level).''.$dir.''.'
' ; //否则是一个目录 然后递归调用函数 深层次的遍历当前遍历到的目录 scan_dir($path,$level+1); }
最后 printr($arr); 就可以看到问题所在了

你加点调试信息

      //判断是否是一个文件      if(is_file($path)){        //var_dump($path);echo  '1
'; //输出文件 $arr[] = array('path' => $path, 'file' => $file, 'level' => $level, 'type' => 'file' ); //echo str_repeat(" ",$level).''.$file.''.'
' ; }else { //输出文件夹名字 $arr[] = array('path' => $path, 'dir' => $dir, 'level' => $level, 'type' => 'dir' ); //echo str_repeat(" ",$level).''.$dir.''.'
' ; //否则是一个目录 然后递归调用函数 深层次的遍历当前遍历到的目录 scan_dir($path,$level+1); }
最后 printr($arr); 就可以看到问题所在了


找到问题了,级别[level]有点乱,但不知道怎么解决,求指点。谢谢!
输出如下
Array
(
[0] => Array
(
[path] => ./digui.php
[file] => digui.php
[level] => 0
[type] => file
)

[1] => Array
(
[path] => ./sbuscan
[dir] => .
[level] => 0
[type] => dir
)

[2] => Array
(
[path] => ./sbuscan/a.php
[file] => a.php
[level] => 1
[type] => file
)

[3] => Array
(
[path] => ./sbuscan/sbuc
[dir] => ./sbuscan
[level] => 1
[type] => dir
)

[4] => Array
(
[path] => ./sbuscan/sbuc/subc.php
[file] => subc.php
[level] => 2
[type] => file
)

[5] => Array
(
[path] => ./test.txt
[file] => test.txt
[level] => 0
[type] => file
)

[6] => Array
(
[path] => ./tiaoshi.php
[file] => tiaoshi.php
[level] => 0
[type] => file
)

)