目录的遍历是个老问题,主要用在目录遍历类操作,比如删除、统计磁盘占用等等情况。目录就是一个典型的树形结构,递归是最简单的方法了。
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 );
}
}
}