本文实例讲述了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程序设计有所帮助。