目录的遍历是个老问题,主要用在目录遍历类操作,比如删除、统计磁盘占用等等情况。目录就是一个典型的树形结构,递归是最简单的方法了。
function ErgodicDirectory1($dir) {
$dp = opendir($dir);
while ($file = readdir($dp)) {
if ($file!='.' && $file!='..') {
$path = $dir ."/". $file;
if (is_dir($path)) {
echo "目录:" .$path. chr(10);
ErgodicDirectory1($path);
} else {
echo "文件:" .$path. chr(10);
}
}
}
closedir($dp);
}
$dp = opendir($dir);
while ($file = readdir($dp)) {
if ($file!='.' && $file!='..') {
$path = $dir ."/". $file;
if (is_dir($path)) {
echo "目录:" .$path. chr(10);
ErgodicDirectory1($path);
} else {
echo "文件:" .$path. chr(10);
}
}
}
closedir($dp);
}
利用一个栈来递归消除:
function ErgodicDirectory2($dir) {
$stack = array($dir);
while (!empty($stack)) {
$curr_dir = array_pop($stack);
if ($dp = opendir($curr_dir)) {
while (($file = readdir($dp))) {
if ($file!='.' && $file!='..') {
$curr_file = "$curr_dir/$file";
if (is_dir($curr_file)) {
echo "目录:". $curr_file . chr(10);
$stack[] = $curr_file;
} else {
echo "文件:". $curr_file . chr(10);
}
}
}
closedir($dp);
}
}
}
$stack = array($dir);
while (!empty($stack)) {
$curr_dir = array_pop($stack);
if ($dp = opendir($curr_dir)) {
while (($file = readdir($dp))) {
if ($file!='.' && $file!='..') {
$curr_file = "$curr_dir/$file";
if (is_dir($curr_file)) {
echo "目录:". $curr_file . chr(10);
$stack[] = $curr_file;
} else {
echo "文件:". $curr_file . chr(10);
}
}
}
closedir($dp);
}
}
}