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的历史和优缺点
Oct 09 PHP
php字符串截取问题
Nov 28 PHP
php之Memcache学习笔记
Jun 17 PHP
深入PHP数据加密详解
Jun 18 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
PHP 快速排序算法详解
Nov 10 PHP
PHP中把对象转换为关联数组代码分享
Apr 09 PHP
php基于jquery的ajax技术传递json数据简单实例
Apr 15 PHP
Yii1.1中通过Sql查询进行的分页操作方法
Mar 16 PHP
Yii2汉字转拼音类的实例代码
Apr 18 PHP
PHP实现的DES加密解密封装类完整实例
Apr 29 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
Oct 18 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 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
设定php简写功能的方法
2019/11/28 PHP
javascript基础第一章 JavaScript与用户端
2010/07/22 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
jquery.fastLiveFilter.js实现输入自动过滤的方法
2015/08/11 Javascript
JavaScript函数柯里化原理与用法分析
2017/03/31 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
浅析Vue自定义组件的v-model
2017/11/26 Javascript
vue 添加vux的代码讲解
2017/11/30 Javascript
Vue响应式原理深入解析及注意事项
2017/12/11 Javascript
基于vue中css预加载使用sass的配置方式详解
2018/03/13 Javascript
vscode下vue项目中eslint的使用方法
2019/01/13 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
JS eval代码快速解密实例解析
2020/04/23 Javascript
详解JavaScript匿名函数和闭包
2020/07/10 Javascript
[58:21]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第二场
2018/04/04 DOTA
[52:44]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第一场 6.3
2018/06/04 DOTA
python实现简单的计时器功能函数
2015/03/14 Python
VSCode下配置python调试运行环境的方法
2018/04/06 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
Python自动化运维之Ansible定义主机与组规则操作详解
2019/06/13 Python
分享8点超级有用的Python编程建议(推荐)
2019/10/13 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
python 利用百度API识别图片文字(多线程版)
2020/12/14 Python
2019年Java 最常见的 面试题
2016/10/19 面试题
实习自我鉴定模板
2013/09/28 职场文书
电子信息专业学生自荐信
2013/11/09 职场文书
数控机械专业个人的自我评价
2014/01/02 职场文书
管理专员自荐信
2014/01/26 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
县委党的群众路线教育实践活动工作情况报告
2014/10/25 职场文书
基于Python实现的购物商城管理系统
2021/04/27 Python
一文搞懂Python Sklearn库使用
2021/08/23 Python