php遍历树的常用方法汇总
本文实例讲述了php遍历树的常用方法。分享给大家供大家参考。具体如下:
一、递归的深度优先的算法:
<?php
define('DS',DIRECTORY_SEPARATOR);
functionrec_list_files($from='.')
{
if(!is_dir($from)){
returnarray();
}
$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;
}
functionprofile($func,$trydir)
{
$mem1=memory_get_usage();
echo'<pre>-----------------------Testrunfor'.$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>Maxmemoryfor'.$func.'():%0.2fkbytesRunningtimefor'.$func.'():%0.fs</pre>',
($mem2-$mem1)/1024.0,$time);
return$list;
}
profile('rec_list_files',"D:\www\server");
?>
二、递归的深度优先的算法(用了一个栈来实现)
<?php
define('DS',DIRECTORY_SEPARATOR);
functiondeep_first_list_files($from='.')
{
if(!is_dir($from)){
returnfalse;
}
$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;
}
functionprofile($func,$trydir)
{
$mem1=memory_get_usage();
echo'<pre>-----------------------Testrunfor'.$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>Maxmemoryfor'.$func.'():%0.2fkbytesRunningtimefor'.$func.'():%0.fs</pre>',
($mem2-$mem1)/1024.0,$time);
return$list;
}
profile('deep_first_list_files',"D:\www\server");
?>
三、非递归的广度优先算法(用了一个队列来实现)
<?php
define('DS',DIRECTORY_SEPARATOR);
functionbreadth_first_files($from='.'){
$queue=array(rtrim($from,DS).DS);//normalizeallpaths
$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);
}//elseunabletoopendirectory=>NEXTCHILD
}
return$files;//endoftree,filenotfound
}
functionprofile($func,$trydir)
{
$mem1=memory_get_usage();
echo'<pre>-----------------------Testrunfor'.$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>Maxmemoryfor'.$func.'():%0.2fkbytesRunningtimefor'.$func.'():%0.fs</pre>',
($mem2-$mem1)/1024.0,$time);
return$list;
}
profile('breadth_first_files',"D:\www\server");
?>
希望本文所述对大家的php程序设计有所帮助。