热搜:NVER node 开发 php

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

2024-07-27 12:55:01
请大神帮我看看这两段代码有什么不同。为什么输出的结果不一样

/**
 * 遍历目录和子目录及文件
 * @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
        )

)