/**
* 遍曆目錄和子目錄及檔案
* @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
)
)