請大神幫我看看這兩段代碼有什麼不同。為什麼輸出的結果不一樣

來源:互聯網
上載者:User
/**
* 遍曆目錄和子目錄及檔案
* @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
)

)
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.