您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

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

2024/4/3 3:53:17发布18次查看
/**
 * 遍历目录和子目录及文件
 * @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
        )
)
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product