php遍历树的常用方法汇总

2025-05-29 0 108

本文实例讲述了php遍历的常用方法。分享给大家供大家参考。具体如下:

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

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

?>

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

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

?>

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40
<?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程序设计有所帮助。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 php遍历树的常用方法汇总 https://www.kuaiidc.com/101441.html

相关文章

发表评论
暂无评论