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