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 页面编码声明方法详解(header或meta)
Mar 12 PHP
10个简化PHP开发的工具
Dec 25 PHP
PHP使用array_fill定义多维数组的方法
Mar 18 PHP
php安装swoole扩展的方法
Mar 19 PHP
PHP使用PHPexcel导入导出数据的方法
Nov 14 PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
Jan 25 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
Apr 28 PHP
PHP类和对象相关系统函数与运算符小结
Sep 28 PHP
php实现博客,论坛图片防盗链的方法
Oct 15 PHP
php实现数据库的增删改查
Feb 26 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
May 19 PHP
Git命令之分支详解
Mar 02 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
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
Jquery api 速查表分享
2015/01/12 Javascript
javascript常用功能汇总
2015/07/05 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
使用snowfall.jquery.js实现爱心满屏飞的效果
2017/01/05 Javascript
微信小程序 向左滑动删除功能的实现
2017/03/10 Javascript
简单谈谈原生js的math对象
2017/06/27 Javascript
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
vue脚手架搭建过程图解
2018/06/06 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
vue element 中的table动态渲染实现(动态表头)
2019/11/21 Javascript
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
python list转dict示例分享
2014/01/28 Python
python基础教程之数字处理(math)模块详解
2014/03/25 Python
Python操作串口的方法
2015/06/17 Python
200行自定义python异步非阻塞Web框架
2017/03/15 Python
python使用sqlite3时游标使用方法
2018/03/13 Python
python导入模块交叉引用的方法
2019/01/19 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
python文件写入write()的操作
2019/05/14 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
2019/11/20 Python
Pytorch 实现冻结指定卷积层的参数
2020/01/06 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
Django+Uwsgi+Nginx如何实现生产环境部署
2020/07/31 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
2020/12/07 Python
Monnier Freres中文官网:法国领先的奢侈品配饰在线零售商
2017/11/01 全球购物
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
Linux操作面试题
2015/02/11 面试题
大学生求职信范文应怎么写
2014/01/01 职场文书
社区志愿者活动总结
2014/06/26 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
python通过opencv调用摄像头操作实例分析
2021/06/07 Python
tomcat下部署jenkins的方法
2022/05/06 Servers