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-MySQL教程归纳总结
Jun 07 PHP
Memcache 在PHP中的使用技巧
Feb 08 PHP
php垃圾代码优化操作代码
Aug 05 PHP
php中删除字符串中最先出现某个字符的实现代码
Feb 03 PHP
PHP面向对象之旅:深入理解static变量与方法
Jan 06 PHP
php+mysql实现数据库随机重排实例
Oct 17 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
Oct 23 PHP
PHP通过插入mysql数据来实现多机互锁实例
Nov 05 PHP
php解析http获取的json字符串变量总是空白null
Mar 02 PHP
PHP实现的一致性哈希算法完整实例
Nov 14 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 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
Cappuccino 卡布其诺咖啡之制作
2021/03/03 冲泡冲煮
php 生成文字png图片的代码
2011/04/17 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
php定界符
2014/06/19 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
2014/06/19 PHP
php计划任务之ignore_user_abort函数实现方法
2015/01/08 PHP
thinkPHP3.2.2框架行为扩展及demo示例
2018/06/19 PHP
基于JQuery的Select选择框的华丽变身
2011/08/23 Javascript
jquery拖动插件(jquery.drag)使用介绍
2013/06/18 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
2016/08/18 Javascript
微信小程序 两种滑动方式(横向滑动,竖向滑动)详细及实例代码
2017/01/13 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
Vue两种组件类型:递归组件和动态组件的用法
2020/08/06 Javascript
用Python登录好友QQ空间点赞的示例代码
2017/11/04 Python
简单实现python聊天程序
2018/04/01 Python
python复制文件到指定目录的实例
2018/04/27 Python
python 文件查找及内容匹配方法
2018/10/25 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
pytorch 准备、训练和测试自己的图片数据的方法
2020/01/10 Python
CSS3 制作旋转的大风车(充满童年回忆)
2013/01/30 HTML / CSS
女性时尚网购:Chic Me
2019/07/30 全球购物
飞利浦美国官网:Philips美国
2020/02/28 全球购物
房地产广告词大全
2014/03/19 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
2015年卫生监督工作总结
2015/05/21 职场文书
小学班级口号大全
2015/12/25 职场文书
银行求职信范文
2019/05/13 职场文书
关于战胜挫折的名言警句大全!
2019/07/05 职场文书
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB
浅谈Python中对象是如何被调用的
2022/04/06 Python