This article mainly introduces common methods of php tree traversal, and analyzes three methods of tree traversal commonly used by php, for more information about php tree traversal, see the following example. Share it with you for your reference. The details are as follows:
1. recursive depth-first algorithms:
<?phpdefine('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");?>
2. recursive depth-first algorithms (implemented using a stack)
<?phpdefine('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");?>
III. non-recursive breadth-first algorithm (implemented using a queue)
<?phpdefine('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");?>
I hope this article will help you with php programming.