当前位置:首页 > PHP教程 > php应用 > 列表

php遍历树的常用方法汇总

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-28 21:29:58 浏览: 评论:0 

这篇文章主要介绍了php遍历树的常用方法,实例分析了php常用的三种遍历树的技巧,需要的朋友可以参考下,本文实例讲述了php遍历树的常用方法,分享给大家供大家参考,具体如下:

一、递归的深度优先的算法:

  1. <?php 
  2. define('DS', DIRECTORY_SEPARATOR); 
  3. function rec_list_files($from = '.'
  4.   if(!is_dir($from)) { 
  5.     return array(); 
  6.   } 
  7.   $files = array(); 
  8.   if($dh = opendir($from)) 
  9.   { 
  10.     while(false !== ($file = readdir($dh))) { 
  11.       if($file == '.' || $file == '..') { 
  12.         continue
  13.       } 
  14.       $path = $from . DS . $file
  15.          
  16.       if (is_file($path)) { 
  17.         $files[] = $path
  18.       } 
  19.       $files = array_merge($files, rec_list_files($path)); 
  20.     } 
  21.     closedir($dh); 
  22.   } 
  23.   return $files
  24. function profile($func$trydir
  25.   $mem1 = memory_get_usage(); 
  26.   echo '<pre>----------------------- Test run for '.$func.'() '
  27.   flush(); 
  28.   $time_start = microtime(true); 
  29.   $list = $func($trydir); 
  30.   //print_r($list); 
  31.   $time = microtime(true) - $time_start
  32.   echo 'Finished : '.count($list).' files</pre>'
  33.   $mem2 = memory_get_peak_usage(); 
  34.   printf('<pre>Max memory for '.$func.'() : %0.2f kbytes Running time for '.$func.'() : %0.f s</pre>'
  35.   ($mem2-$mem1)/1024.0, $time); 
  36.   return $list
  37. profile('rec_list_files'"D:\www\server"); 
  38. ?> 

二、递归的深度优先的算法(用了一个栈来实现)

  1. <?php 
  2. define('DS', DIRECTORY_SEPARATOR); 
  3. function deep_first_list_files($from = '.'
  4.   if(!is_dir($from)) { 
  5.     return false; 
  6.   } 
  7.   $files = array(); 
  8.   $dirs = array($from); 
  9.   while(NULL !== ($dir = array_pop($dirs))) { 
  10.     if$dh = opendir($dir)) { 
  11.       while( false !== ($file = readdir($dh))) { 
  12.         if($file == '.' || $file == '..') { 
  13.           continue
  14.         } 
  15.         $path = $dir . DS . $file
  16.         if(is_dir($path)) { 
  17.           $dirs[] = $path
  18.         } else { 
  19.           $files[] = $path
  20.         } 
  21.       } 
  22.       closedir($dh); 
  23.     } 
  24.   } 
  25.   return $files
  26. function profile($func$trydir
  27.   $mem1 = memory_get_usage(); 
  28.   echo '<pre>----------------------- Test run for '.$func.'() '
  29.   flush(); 
  30.   $time_start = microtime(true); 
  31.   $list = $func($trydir); 
  32.   //print_r($list); 
  33.   $time = microtime(true) - $time_start
  34.   echo 'Finished : '.count($list).' files</pre>'
  35.   $mem2 = memory_get_peak_usage(); 
  36.   printf('<pre>Max memory for '.$func.'() : %0.2f kbytes Running time for '.$func.'() : %0.f s</pre>'
  37.   ($mem2-$mem1)/1024.0, $time); 
  38.   return $list
  39. profile('deep_first_list_files'"D:\www\server"); 
  40. ?> 

三、非递归的广度优先算法(用了一个队列来实现)

  1. <?php 
  2. define('DS', DIRECTORY_SEPARATOR); 
  3. function breadth_first_files($from = '.') { 
  4.   $queue = array(rtrim($from, DS).DS);// normalize all paths 
  5.   $files = array(); 
  6.   while($base = array_shift($queue )) { 
  7.     if (($handle = opendir($base))) { 
  8.       while (($child = readdir($handle)) !== false) { 
  9.         if$child == '.' || $child == '..') { 
  10.           continue
  11.         } 
  12.         if (is_dir($base.$child)) { 
  13.           $combined_path = $base.$child.DS; 
  14.           array_push($queue$combined_path); 
  15.         } else { 
  16.           $files[] = $base.$child
  17.         } 
  18.       } 
  19.       closedir($handle); 
  20.     } // else unable to open directory => NEXT CHILD 
  21.   } 
  22.   return $files// end of tree, file not found 
  23. function profile($func$trydir
  24.   $mem1 = memory_get_usage(); 
  25.   echo '<pre>----------------------- Test run for '.$func.'() '
  26.   flush(); 
  27.   $time_start = microtime(true); 
  28.   $list = $func($trydir); 
  29.   //print_r($list); 
  30.   $time = microtime(true) - $time_start
  31.   echo 'Finished : '.count($list).' files</pre>'
  32.   $mem2 = memory_get_peak_usage(); 
  33.   printf('<pre>Max memory for '.$func.'() : %0.2f kbytes Running time for '.$func.'() : %0.f s</pre>'
  34.   ($mem2-$mem1)/1024.0, $time); 
  35.   return $list
  36. profile('breadth_first_files'"D:\www\server"); 
  37. ?>

Tags: php遍历树

分享到: