A5下载 - 努力做内容最丰富最安全的下载站!

A5站长下载站

当前位置:A5下载 > 源码技巧 > 其它源码教程 > php遍历树的常用方法汇总

php遍历树的常用方法汇总

时间:2015-07-25 11:55作者:fang人气:61

本文实例讲述了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:wwwserver");

?>

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

<?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:wwwserver");

?>

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

<?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:wwwserver");

?>

希望本文所述对大家的php程序设计有所帮助。

标签php,遍历,常用,方法,汇总,本文,实例,讲述了,php

相关下载

查看所有评论+

网友评论

网友
您的评论需要经过审核才能显示

公众号