当前位置:首页 > PHP教程 > php应用 > 列表

PHP不用递归遍历目录下所有文件的代码

发布:smiling 来源: PHP粉丝网  添加日期:2021-03-12 21:19:02 浏览: 评论:0 

这篇文章主要介绍了PHP不用递归实现列出目录下所有文件的代码,本文列出了两种方法,并和递归方法做了一个对比,需要的朋友可以参考下

实现代码:

  1. /** 
  2.  * PHP 非递归实现查询该目录下所有文件 
  3.  * @param unknown $dir 
  4.  * @return multitype:|multitype:string 
  5.  */ 
  6. function scanfiles($dir) { 
  7.  if (! is_dir ( $dir )) 
  8.  return array (); 
  9.    
  10.  // 兼容各操作系统 
  11.  $dir = rtrim ( str_replace ( '\\', '/', $dir ), '/' ) . '/'; 
  12.    
  13.  // 栈,默认值为传入的目录 
  14.  $dirs = array ( $dir ); 
  15.    
  16.  // 放置所有文件的容器 
  17.  $rt = array (); 
  18.    
  19.  do { 
  20.  // 弹栈 
  21.  $dir = array_pop ( $dirs ); 
  22.    
  23.  // 扫描该目录 
  24.  $tmp = scandir ( $dir ); 
  25.    
  26.  foreach ( $tmp as $f ) { 
  27.   // 过滤. .. 
  28.   if ($f == '.' || $f == '..'
  29.   continue
  30.     
  31.   // 组合当前绝对路径 
  32.   $path = $dir . $f
  33.     
  34.     
  35.   // 如果是目录,压栈。 
  36.   if (is_dir ( $path )) { 
  37.   array_push ( $dirs$path . '/' ); 
  38.   } else if (is_file ( $path )) { // 如果是文件,放入容器中 
  39.   $rt [] = $path
  40.   } 
  41.  } 
  42.    
  43.  } while ( $dirs ); // 直到栈中没有目录 
  44.    
  45.  return $rt

附另一篇:不用递归遍历目录下的文件

如果要遍历某个目录下的所有文件(包括子目录),最首先想到的思路就是用递归:先处理当前目录,再处理当前目录下的子目录。不用递归可不可以呢?以前学数据结构的时候看到过,递归其实是利用堆栈来实现的,递归的特点就是不断的调用自身,最后一次的调用是最先执行完的,倒数第二次调用是其次执行完的,依次类推,最初的调用是最后执行完的。如果理解了递归的原理,其实就可以把所有用递归的实现转化为非递归的实现。

用非递归方式遍历某个目录下的所有文件,思路主要分三步:

1. 创建一个数组,将要遍历的这个目录放入;(其实就是创建了一个栈)

2. 循环处理这个数组,循环结束的条件是数组为空;

3. 每次循环,处理数组中的一个元素,并将元素删除,如果这个元素是目录,则将目录下所有的子元素加入数组;

按照这种思路写出的代码如下:

  1. /** 
  2.  * 遍历某个目录下的所有文件 
  3.  * @param string $dir 
  4.  */ 
  5. function scanAll($dir
  6.   $list = array(); 
  7.   $list[] = $dir
  8.  
  9.   while (count($list) > 0) 
  10.   { 
  11.     //弹出数组最后一个元素 
  12.     $file = array_pop($list); 
  13.  
  14.     //处理当前文件 
  15.     echo $file."\r\n"
  16.  
  17.     //如果是目录 
  18.     if (is_dir($file)) 
  19.     { 
  20.       $children = scandir($file); 
  21.       foreach ($children as $child
  22.       { 
  23.         if ($child !== '.' && $child !== '..'
  24.         { 
  25.           $list[] = $file.'/'.$child
  26.         } 
  27.       } 
  28.     } 
  29.   } 

这里我并没有认为递归有多大的缺点,事实上很多情况下,用递归来设计还是非常简洁可读的,至于效率问题,除非在递归深度特别大的时候,才会有影响。

以下是用递归的实现,作为对比:

  1. /** 
  2.  * 遍历某个目录下的所有文件(递归实现) 
  3.  * @param string $dir 
  4.  */ 
  5. function scanAll2($dir
  6.   echo $dir."\r\n"
  7.  
  8.   if (is_dir($dir)) 
  9.   { 
  10.     $children = scandir($dir); 
  11.     foreach ($children as $child
  12.     { 
  13.       if ($child !== '.' && $child !== '..'
  14.       { 
  15.         scanAll2($dir.'/'.$child); 
  16.       } 
  17.     } 
  18.   } 

运行发现,两个函数的结果略有不同,主要表现在打印的顺序上。函数一运行结果的顺序是倒着的,是因为压栈的顺序正好和scandir出来的顺序相反了,可以将第21行改一下:

$children = array_reverse(scandir($file));

这样出来结果就完全相同了。

Tags: PHP递归遍历目录

分享到: