首页建站经验 php遍历树的常用方法汇总

php遍历树的常用方法汇总

本文实例讲述了php遍历树的常用方法。分享给大家供大家参考。具体如下:一、递归的深度优先的算法:二、递归的深度优先的算法(用了一个栈来实现)三、非递归的广度优先算法(用了一…

本文实例讲述了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 '

----------------------- 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

';

$mem2 = memory_get_peak_usage();

printf('

Max memory for '.$func.'() : %0.2f kbytes Running time for '.$func.'() : %0.f s
',

($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 '

----------------------- 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

';

$mem2 = memory_get_peak_usage();

printf('

Max memory for '.$func.'() : %0.2f kbytes Running time for '.$func.'() : %0.f s
',

($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 '

----------------------- 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

';

$mem2 = memory_get_peak_usage();

printf('

Max memory for '.$func.'() : %0.2f kbytes Running time for '.$func.'() : %0.f s
',

($mem2-$mem1)/1024.0, $time);

return $list;

}

profile('breadth_first_files', "D:/www/server");

?>

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

本文来自网络,不代表1号站长-站长学院|资讯交流平台立场。转载请注明出处: https://www.1cn.cc/jianzhan/jingyan/18207.html
上一篇为你的WordPress主题框架创建子主题
下一篇 Laravel 中获取上一篇和下一篇数据
admin

作者: admin

这里可以再内容模板定义一些文字和说明,也可以调用对应作者的简介!或者做一些网站的描述之类的文字或者HTML!

为您推荐

评论列表()

    联系我们

    联系我们

    0898-88888888

    在线咨询: QQ交谈

    邮箱: email@wangzhan.com

    工作时间:周一至周五,9:00-17:30,节假日休息

    关注微信
    微信扫一扫关注我们

    微信扫一扫关注我们

    关注微博
    返回顶部