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 相关文章推荐
Php获取金书网的书名的实现代码
Jun 11 PHP
探讨:parse url解析URL,返回其组成部分
Jun 14 PHP
ThinkPHP验证码和分页实例教程
Aug 22 PHP
php中file_get_content 和curl以及fopen 效率分析
Sep 19 PHP
PHP 9 大缓存技术总结
Sep 17 PHP
编写PHP脚本来实现WordPress中评论分页的功能
Dec 10 PHP
Yii使用Captcha验证码的方法
Dec 28 PHP
php实现爬取和分析知乎用户数据
Jan 26 PHP
php、java、android、ios通用的3des方法(推荐)
Sep 09 PHP
PHP屏蔽关键字实现方法
Nov 17 PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
Nov 24 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
PHP获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
php页面防重复提交方法总结
2013/11/25 PHP
PHP获取当前页面URL函数实例
2014/10/22 PHP
php将图片保存为不同尺寸图片的图片类实例
2015/03/30 PHP
PHP生成plist数据的方法
2015/06/16 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
PHP判断手机是IOS还是Android
2015/12/09 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
2012/02/27 Javascript
jQuery鼠标事件汇总
2015/08/30 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
Angular2使用Guard和Resolve进行验证和权限控制
2017/04/24 Javascript
AngularJS实现的回到顶部指令功能实例
2017/05/17 Javascript
关于vue.js组件数据流的问题
2017/07/26 Javascript
微信小程序之滚动视图容器的实现方法
2017/09/26 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
vuejs项目打包之后的首屏加载优化及打包之后出现的问题
2018/04/01 Javascript
ES10 特性的完整指南小结
2019/03/04 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
uni-app自定义导航栏按钮|uniapp仿微信顶部导航条功能
2019/11/12 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
2020/02/07 Javascript
Vue实现简单计算器案例
2020/02/25 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
Python 中的range(),以及列表切片方法
2018/07/02 Python
python脚本监控Tomcat服务器的方法
2018/07/06 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
Python3.7下安装pyqt5的方法步骤(图文)
2020/05/12 Python
HTML5之SVG 2D入门5—颜色的表示及定义方式
2013/01/30 HTML / CSS
AmazeUI在模态框中嵌入表单形成模态输入框
2020/08/20 HTML / CSS
什么是Rollback Segment
2013/04/22 面试题
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
python实现ROA算子边缘检测算法
2021/04/05 Python
基于python实现银行管理系统
2021/04/20 Python
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS