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 相关文章推荐
杏林同学录(八)
Oct 09 PHP
php 表单数据的获取代码
Mar 10 PHP
备份mysql数据库的php代码(一个表一个文件)
May 28 PHP
解析PHP可变函数的经典用法
Jun 20 PHP
php中出现空白页的原因及解决方法汇总
Jul 08 PHP
thinkphp中session和cookie无效的解决方法
Dec 19 PHP
PHP简单实现生成txt文件到指定目录的方法
Apr 25 PHP
老生常谈PHP面向对象之标识映射
Jun 21 PHP
thinkPHP框架中执行原生SQL语句的方法
Oct 25 PHP
php实现解析xml并生成sql语句的方法
Feb 03 PHP
微信公众号开发之获取位置信息php代码
Jun 13 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
Nov 26 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
德生S2000南麂列岛台湾FM收听记录
2021/03/02 无线电
比较简单的百度网盘文件直链PHP代码
2013/03/24 PHP
symfony2.4的twig中date用法分析
2016/03/18 PHP
js 页面传参数时 参数值含特殊字符的问题
2009/12/13 Javascript
优化javascript的执行速度
2010/01/23 Javascript
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
JS 跳转页面延迟2种方法
2013/03/29 Javascript
js 验证身份证信息有效性
2014/03/28 Javascript
推荐 21 款优秀的高性能 Node.js 开发框架
2014/08/18 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
Vue中的v-cloak使用解读
2017/03/27 Javascript
基于Vue的移动端图片裁剪组件功能
2017/11/28 Javascript
python Selenium爬取内容并存储至MySQL数据库的实现代码
2017/03/16 Python
Python排序搜索基本算法之堆排序实例详解
2017/12/08 Python
Python设计模式之工厂模式简单示例
2018/01/09 Python
Win10下Python3.7.3安装教程图解
2019/07/08 Python
Python占用的内存优化教程
2019/07/28 Python
django formset实现数据表的批量操作的示例代码
2019/12/06 Python
Python实现鼠标自动在屏幕上随机移动功能
2020/03/14 Python
Django 5种类型Session使用方法解析
2020/04/29 Python
手机端用rem+scss做适配的详解
2017/11/15 HTML / CSS
美体小铺英国官网:The Body Shop英国
2017/01/24 全球购物
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
酒店前厅员工辞职信
2014/01/08 职场文书
珍珠鸟教学反思
2014/02/01 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
大学生村官个人总结
2015/02/15 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
2015学校图书管理员工作总结
2015/05/11 职场文书
南京南京观后感
2015/06/02 职场文书