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文件上传主要代码讲解
Sep 30 PHP
php中并发读写文件冲突的解决方案
Oct 25 PHP
php检测用户是否用手机(Mobile)访问网站的类
Jan 09 PHP
PHP常用函数和常见疑难问题解答
Mar 05 PHP
php设计模式之简单工厂模式详解
Sep 04 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
Laravel中使用自己编写类库的3种方法
Feb 10 PHP
PHP多维数组遍历方法(2种实现方法)
Dec 10 PHP
Symfony2学习笔记之模板用法详解
Mar 17 PHP
Laravel 实现密码重置功能
Feb 23 PHP
PHP 模拟登陆功能实例详解
Sep 10 PHP
php+mysql实现的无限分类方法类定义与使用示例
May 27 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/02/05 PHP
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
深入理解PHP中的Session和Cookie
2013/06/21 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
原生javascript图片自动或手动切换示例附演示源码
2013/09/04 Javascript
用jquery模仿的a的title属性的例子
2014/10/22 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
基于canvas实现的钟摆效果完整实例
2016/01/26 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
Javascript操作select控件代码实例
2020/02/14 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
跟老齐学Python之私有函数和专有方法
2014/10/24 Python
Python打印scrapy蜘蛛抓取树结构的方法
2015/04/08 Python
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
Python中断言Assertion的一些改进方案
2016/10/27 Python
python matplotlib 注释文本箭头简单代码示例
2018/01/08 Python
使用python爬虫获取黄金价格的核心代码
2018/06/13 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
python实现输入任意一个大写字母生成金字塔的示例
2019/10/27 Python
python网络编程:socketserver的基本使用方法实例分析
2020/04/09 Python
Python3.9.1中使用match方法详解
2021/02/08 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
2021/03/04 Python
HTML5 Web Workers之网站也能多线程的实现
2013/04/24 HTML / CSS
自动化工程专业个人应聘自荐信
2013/09/26 职场文书
财务会计专业毕业生自荐信
2013/10/19 职场文书
2014年乡镇工会工作总结
2014/12/02 职场文书
房地产公司工程部经理岗位职责
2015/04/09 职场文书
幼儿园六一主持词
2015/06/30 职场文书
请求模块urllib之PYTHON爬虫的基本使用
2022/04/08 Python