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学习 函数 课件
Jun 15 PHP
PHP注释实例技巧
Oct 03 PHP
Ajax+PHP 边学边练 之二 实例
Nov 24 PHP
理解php原理的opcodes(操作码)
Oct 26 PHP
具有时效性的php加密解密函数代码
Jun 19 PHP
解析php addslashes()与addclashes()函数的区别和比较
Jun 24 PHP
php中创建和调用webservice接口示例
Jul 25 PHP
PHP实现获取域名的方法小结
Nov 05 PHP
Windows7下的php环境配置教程
Feb 28 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
Dec 11 PHP
PHP中list()函数用法实例简析
Jan 08 PHP
PHP中PDO的事务处理分析
Apr 07 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去掉从word直接粘贴过来的没有用格式的函数
2012/10/29 PHP
php中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
PHP中isset()和unset()函数的用法小结
2014/03/11 PHP
php使用curl和正则表达式抓取网页数据示例
2014/04/13 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
2018/03/31 PHP
php 策略模式原理与应用深入理解
2019/09/25 PHP
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
Javascript操作cookie的函数代码
2012/10/03 Javascript
js multiple全选与取消全选实现代码
2012/12/04 Javascript
js 取时间差去掉周六周日实现代码
2012/12/25 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
jQuery实现图片渐入渐出切换展示效果
2015/08/15 Javascript
当jquery ajax遇上401请求的解决方法
2016/05/19 Javascript
vue中配置mint-ui报css错误问题的解决方法
2017/10/11 Javascript
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
jQuery中each和js中forEach的区别分析
2019/02/27 jQuery
vue视频播放插件vue-video-player的具体使用方法
2019/11/08 Javascript
vue实现的封装全局filter并统一管理操作示例
2020/02/02 Javascript
Python调用C语言的方法【基于ctypes模块】
2018/01/22 Python
python抓取文件夹的所有文件
2018/02/27 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
Python读写操作csv和excle文件代码实例
2020/03/16 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
基于python模拟TCP3次握手连接及发送数据
2020/11/06 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
Aosom西班牙:家具在线商店
2020/06/11 全球购物
专科毕业生学习生活的自我评价
2013/10/26 职场文书
《乌塔》教学反思
2014/02/17 职场文书
珍惜时间演讲稿
2014/05/14 职场文书
Python数据分析之pandas读取数据
2021/06/02 Python
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python
分布式Redis Cluster集群搭建与Redis基本用法
2022/02/24 Redis