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
介绍几个array库的新函数 php
Dec 29 PHP
php学习之function的用法
Jul 14 PHP
php实现MD5加密16位(不要默认的32位)
Aug 12 PHP
PHP模拟QQ登录的方法
Jul 29 PHP
php删除数组指定元素实现代码
May 03 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
PHP实现类似于C语言的文件读取及解析功能
Sep 01 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
Mar 15 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
Jun 13 PHP
laravel请求参数校验方法
Oct 10 PHP
php框架知识点的整理和补充
Mar 01 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 一维数组的循环遍历实现代码
2017/04/10 PHP
yii2项目实战之restful api授权验证详解
2017/05/20 PHP
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
用Javascript实现Windows任务管理器的代码
2012/03/27 Javascript
jQuery中多个元素的Hover事件解决方案
2014/06/12 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
JavaScript设计模式之适配器模式介绍
2014/12/28 Javascript
jQuery实现跟随鼠标运动图层效果的方法
2015/02/02 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
浅谈javascript中的DOM方法
2015/07/16 Javascript
JavaScript中setter和getter方法介绍
2016/07/11 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
详解各版本React路由的跳转的方法
2018/05/10 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
微信小程序开发常见问题及解决方案
2019/07/11 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
JS实现判断移动端PC端功能
2020/02/21 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
Python中zfill()方法的使用教程
2015/05/20 Python
详细讲解Python中的文件I/O操作
2015/05/24 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
Python3.4 splinter(模拟填写表单)使用方法
2018/10/13 Python
Python函数和模块的使用总结
2019/05/20 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
皮肤科医师岗位职责
2013/12/04 职场文书
不打扫卫生检讨书
2014/02/12 职场文书
协议书范本
2014/04/23 职场文书
写给孩子的新学期寄语
2015/02/27 职场文书
2015年社区统计工作总结
2015/04/21 职场文书
南京大屠杀观后感
2015/06/02 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
使用php的mail()函数实现发送邮件功能
2021/06/03 PHP
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python
Oracle用户管理及赋权
2022/04/24 Oracle
Win10系统搭建ftp文件服务器详细教程
2022/08/05 Servers