集团主站
欢迎来到成都达内官方网站!达内—美国上市公司 亿元级外企IT培训企业!
成都it培训哪家好
成都it培训哪家好
全国服务监督电话:400-111-8989  |   联系客服   |
当前位置:主页 > 培训课程 > PHP >

成都PHP学校技术讲解之PHP非递归遍历目录下所有文件

发布者: 成都达内     浏览次数:     发布时间:2018-08-22 10:15:57

成都PHP学校技术讲解之PHP非递归遍历目录下所有文件,以下是正文内容,二话不说,直接看代码...

  成都PHP学校技术讲解之PHP非递归遍历目录下所有文件

  以下是正文内容,二话不说,直接看代码

  /**

  * PHP 非递归实现查询该目录下所有文件

  * @param unknown $dir

  * @return multitype:|multitype:string

  */

  function scanfiles($dir) {

  if (! is_dir ( $dir ))

  return array ();

  // 兼容各操作系统

  $dir = rtrim ( str_replace ( '\\', '/', $dir ), '/' ) . '/';

  // 栈,默认值为传入的目录

  $dirs = array ( $dir );

  // 放置所有文件的容器

  $rt = array ();

  do {

  // 弹栈

  $dir = array_pop ( $dirs );

  // 扫描该目录

  $tmp = scandir ( $dir );

  foreach ( $tmp as $f ) {

  // 过滤. ..

  if ($f == '.' || $f == '..')

  continue;

  // 组合当前绝对路径

  $path = $dir . $f;

  // 如果是目录,压栈。

  if (is_dir ( $path )) {

  array_push ( $dirs, $path . '/' );

  } else if (is_file ( $path )) { // 如果是文件,放入容器中

  $rt [] = $path;

  }

  }

  } while ( $dirs ); // 直到栈中没有目录

  return $rt;

  }

  ?>

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

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

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

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

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

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

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

  /**

  * 遍历某个目录下的所有文件

  * @param string $dir

  */

  function scanAll($dir)

  {

  $list = array();

  $list[] = $dir;

  while (count($list) > 0)

  {

  //弹出数组最后一个元素

  $file = array_pop($list);

  //处理当前文件

  echo $file."\r\n";

  //如果是目录

  if (is_dir($file))

  {

  $children = scandir($file);

  foreach ($children as $child)

  {

  if ($child !== '.' && $child !== '..')

  {

  $list[] = $file.'/'.$child;

  }

  }

  }

  }

  }

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

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

  /**

  * 遍历某个目录下的所有文件(递归实现)

  * @param string $dir

  */

  function scanAll2($dir)

  {

  echo $dir."\r\n";

  if (is_dir($dir))

  {

  $children = scandir($dir);

  foreach ($children as $child)

  {

  if ($child !== '.' && $child !== '..')

  {

  scanAll2($dir.'/'.$child);

  }

  }

  }

  }

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

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

(责任编辑:范老师)
最新开班
  • 成都Java培训班
    免费试听名额发放中...
  • 成都C++培训班
    免费试听名额发放中...
  • 成都PHP培训班
    免费试听名额发放中...
  • 成都网络工程培训班
    免费试听名额发放中...
  • 成都Unity3D培训班
    免费试听名额发放中...
  • 成都大数据培训班
    免费试听名额发放中...
  • 成都uid培训班
    免费试听名额发放中...
  • 成都会计培训班
    免费试听名额发放中...
  • 成都Python培训班
    免费试听名额发放中...
  • 成都嵌入式培训班
    免费试听名额发放中...
  • 成都web培训班
    免费试听名额发放中...
  • 成都软件测试培训班
    免费试听名额发放中...
在线留言
提交

校区地址:成都市锦江区东大街紫东楼端35号明宇金融广场19楼1906室

联系电话:400-111-8989

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市高新区奥克斯广场蜀锦路209号一楼商铺

联系电话:400-111-8989

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

校区地址:成都锦江区东大街芷泉街229号东方广场C座3楼303

联系电话:400-111-8989

公交路线:芷泉街(188路;115路;515路;236路;505路;501路;84路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市武侯区佳灵路3号红牌楼广场2号写字楼11楼1115号

联系电话:400-111-8989

公交路线:红牌楼东(11路;92路;100路;111路;139路;g28路;快速公交K1/K2) 地铁路线:红牌楼站(地铁3号线)

校区地址:成都市锦江区红星路二段70号四川日报大厦502-2

联系电话:400-111-8989

公交路线:市二医院站(6路;49路;102路;5路;37路;g92路;) 地铁路线:地铁市二医院(地铁3号线)

校区地址:成都市锦江区东大街芷泉段229号东方广场C座16层

联系电话:400-111-8989

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:四川省成都市武侯区高新科技孵化园9号园区E座7楼

联系电话:400-111-8989

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

了解达内动态
关注成都达内教育公众号

首页 | 关于达内 | 课程中心 | 专家师资 | 视频教程 | 学员空间 | 校企合作 | 新闻资讯 | 就业指导 | 网站地图

2016-2025 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56 蜀ICP备18021046号-3