php遍历树的常用方法汇总


Posted in PHP onJune 18, 2015

本文实例讲述了php遍历树的常用方法。分享给大家供大家参考。具体如下:

一、递归的深度优先的算法:

<?php
define('DS', DIRECTORY_SEPARATOR);
function rec_list_files($from = '.')
{
  if(!is_dir($from)) {
    return array();
  }
  $files = array();
  if($dh = opendir($from))
  {
    while(false !== ($file = readdir($dh))) {
      if($file == '.' || $file == '..') {
        continue;
      }
      $path = $from . DS . $file;
       
      if (is_file($path)) {
        $files[] = $path;
      }
      $files = array_merge($files, rec_list_files($path));
    }
    closedir($dh);
  }
  return $files;
}
function profile($func, $trydir)
{
  $mem1 = memory_get_usage();
  echo '<pre>----------------------- Test run for '.$func.'() ';
  flush();
  $time_start = microtime(true);
  $list = $func($trydir);
  //print_r($list);
  $time = microtime(true) - $time_start;
  echo 'Finished : '.count($list).' files</pre>';
  $mem2 = memory_get_peak_usage();
  printf('<pre>Max memory for '.$func.'() : %0.2f kbytes Running time for '.$func.'() : %0.f s</pre>',
  ($mem2-$mem1)/1024.0, $time);
  return $list;
}
profile('rec_list_files', "D:\www\server");
?>

二、递归的深度优先的算法(用了一个栈来实现)

<?php
define('DS', DIRECTORY_SEPARATOR);
function deep_first_list_files($from = '.')
{
  if(!is_dir($from)) {
    return false;
  }
  $files = array();
  $dirs = array($from);
  while(NULL !== ($dir = array_pop($dirs))) {
    if( $dh = opendir($dir)) {
      while( false !== ($file = readdir($dh))) {
        if($file == '.' || $file == '..') {
          continue;
        }
        $path = $dir . DS . $file;
        if(is_dir($path)) {
          $dirs[] = $path;
        } else {
          $files[] = $path;
        }
      }
      closedir($dh);
    }
  }
  return $files;
}
function profile($func, $trydir)
{
  $mem1 = memory_get_usage();
  echo '<pre>----------------------- Test run for '.$func.'() ';
  flush();
  $time_start = microtime(true);
  $list = $func($trydir);
  //print_r($list);
  $time = microtime(true) - $time_start;
  echo 'Finished : '.count($list).' files</pre>';
  $mem2 = memory_get_peak_usage();
  printf('<pre>Max memory for '.$func.'() : %0.2f kbytes Running time for '.$func.'() : %0.f s</pre>',
  ($mem2-$mem1)/1024.0, $time);
  return $list;
}
profile('deep_first_list_files', "D:\www\server");
?>

三、非递归的广度优先算法(用了一个队列来实现)

<?php
define('DS', DIRECTORY_SEPARATOR);
function breadth_first_files($from = '.') {
  $queue = array(rtrim($from, DS).DS);// normalize all paths
  $files = array();
  while($base = array_shift($queue )) {
    if (($handle = opendir($base))) {
      while (($child = readdir($handle)) !== false) {
        if( $child == '.' || $child == '..') {
          continue;
        }
        if (is_dir($base.$child)) {
          $combined_path = $base.$child.DS;
          array_push($queue, $combined_path);
        } else {
          $files[] = $base.$child;
        }
      }
      closedir($handle);
    } // else unable to open directory => NEXT CHILD
  }
  return $files; // end of tree, file not found
}
function profile($func, $trydir)
{
  $mem1 = memory_get_usage();
  echo '<pre>----------------------- Test run for '.$func.'() ';
  flush();
  $time_start = microtime(true);
  $list = $func($trydir);
  //print_r($list);
  $time = microtime(true) - $time_start;
  echo 'Finished : '.count($list).' files</pre>';
  $mem2 = memory_get_peak_usage();
  printf('<pre>Max memory for '.$func.'() : %0.2f kbytes Running time for '.$func.'() : %0.f s</pre>',
  ($mem2-$mem1)/1024.0, $time);
  return $list;
}
profile('breadth_first_files', "D:\www\server");
?>

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
ftp类(example.php)
Oct 09 PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
Nov 19 PHP
PHP跨平台获取服务器IP地址自定义函数分享
Dec 29 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
Dec 24 PHP
php操作xml并将其插入数据库的实现方法
Sep 08 PHP
CI框架AR数据库操作常用函数总结
Nov 21 PHP
实例解析php的数据类型
Oct 24 PHP
PHP实用小技巧之调用录像的方法
Dec 05 PHP
浅析PHP中的 inet_pton 网络函数
Dec 16 PHP
Laravel等框架模型关联的可用性浅析
Dec 15 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
Apr 14 PHP
php编写简单的文章发布程序
Jun 18 #PHP
试用php中oci8扩展
Jun 18 #PHP
浅谈PDO的rowCount函数
Jun 18 #PHP
基于PHP实现的事件机制实例分析
Jun 18 #PHP
php使用MySQL保存session会话的方法
Jun 18 #PHP
php判断表是否存在的方法
Jun 18 #PHP
PHP实现HTTP断点续传的方法
Jun 17 #PHP
You might like
多数据表共用一个页的新闻发布
2006/10/09 PHP
php实现的MySQL通用查询程序
2007/03/11 PHP
thinkPHP的Html模板标签使用方法
2012/11/13 PHP
PHP修改session_id示例代码
2014/01/08 PHP
PHP curl伪造IP地址和header信息代码实例
2015/04/27 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
JS 文件本身编码转换 图文教程
2009/10/12 Javascript
jquery+json 通用三级联动下拉列表
2010/04/19 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
2013/04/24 Javascript
7个有用的jQuery代码片段分享
2015/05/19 Javascript
jquery专业的导航菜单特效代码分享
2015/08/29 Javascript
jQuery实现鼠标选文字发新浪微博的方法
2016/04/02 Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
2016/08/28 Javascript
jQuery的deferred对象使用详解
2016/09/25 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
AngularJS 异步解决实现方法
2017/06/12 Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
2018/06/09 jQuery
了解前端理论:rscss和rsjs
2019/05/23 Javascript
vant picker+popup 自定义三级联动案例
2020/11/04 Javascript
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
浅谈Python单向链表的实现
2015/12/24 Python
python使用装饰器作日志处理的方法
2019/07/11 Python
python实现淘宝购物系统
2019/10/25 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
Python操作Elasticsearch处理timeout超时
2020/07/17 Python
利用Python实现斐波那契数列的方法实例
2020/07/26 Python
CSS3弹性盒模型开发笔记(二)
2016/04/26 HTML / CSS
AmazeUI 手机版页面的顶部导航条Header与侧边导航栏offCanvas的示例代码
2020/08/19 HTML / CSS
以工厂直接定价的传奇性能:Ben Hogan Golf
2019/01/04 全球购物
匈牙利超级网上商店和优惠:Alza.hu
2019/12/17 全球购物
Linux机考试题
2015/10/16 面试题
《狼牙山五壮士》教学反思
2016/02/17 职场文书
css中z-index: 0和z-index: auto的区别
2021/08/23 HTML / CSS
中国古风插画师排行榜:夏达第一,第三是阴阳师姑获鸟皮肤创作者
2022/03/18 国漫