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提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
May 06 PHP
PHP Switch 语句之学习笔记
Sep 21 PHP
div li的多行多列 无刷新分页示例代码
Oct 16 PHP
php中自定义函数dump查看数组信息类似var_dump
Jan 27 PHP
php实现保存submit内容之后禁止刷新
Mar 19 PHP
ThinkPHP有变量的where条件分页实例
Nov 03 PHP
PHP内置的Math函数效率测试
Dec 01 PHP
Yii使用Captcha验证码的方法
Dec 28 PHP
PHP 实现页面静态化的几种方法
Jul 23 PHP
PHP性能测试工具xhprof安装与使用方法详解
Apr 29 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 PHP
php使用Swoole实现毫秒级定时任务的方法
Sep 04 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
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
javascript:void(0)的真正含义实例分析
2008/08/20 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
2014/09/04 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
2015/03/11 Javascript
JS控制层作圆周运动的方法
2016/06/20 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
2017/01/14 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
2017/02/12 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
socket.io与pm2(cluster)集群搭配的解决方案
2017/06/02 Javascript
bootstrap table服务端实现分页效果
2017/08/10 Javascript
nodejs中安装ghost出错的原因及解决方法
2017/10/23 NodeJs
vue.js使用3DES加密的方法示例
2018/05/18 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
Python中的匿名函数使用简介
2015/04/27 Python
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
浅谈scrapy 的基本命令介绍
2017/06/13 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
python读取excel指定列数据并写入到新的excel方法
2018/07/10 Python
使用Python实现Wake On Lan远程开机功能
2020/01/22 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
2020/03/09 Python
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
Hotels.com台湾:饭店订房网
2017/09/06 全球购物
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
美国医生配方营养补充剂供应商:Healthy Directions
2019/07/10 全球购物
主题教育活动总结
2014/05/05 职场文书
岗位职责说明书
2014/05/07 职场文书
中韩经贸翻译专业大学生职业生涯规划范文
2014/09/18 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
有关信念的名言语录集锦
2019/12/06 职场文书
超详细教你怎么升级Mysql的版本
2021/05/19 MySQL
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL
openstack云计算keystone组件工作介绍
2022/04/20 Servers