php知识--递归
<?php // /* * 遍历输出文件夹中的所有内容 * @param1 string $dir,要遍历的路径 * @param2 int $level = 0,当前的级别 */ function myScandir($dir,$level = 0){ //先判断路径是否有效 if(!is_dir($dir)) return false; //从文件夹中取出所有的文件信息 $files = scandir($dir); //遍历输出 foreach($files as $file){ //判断文件类型: 文件夹蓝色,文件红色 //根据level缩进 echo str_repeat(" ",$level * 4); //组合路径 $tmpdir = $dir . '/' . $file; //组合成有效路径 //判断 if(is_dir($tmpdir)){ //路径 echo "<font color='blue'>{$file}</font><br/>"; //考虑当前文件(又是路径)应该想办法解决其中的内容 //排除.和.. if($file != '.' && $file != '..'){ //有效文件夹: $tmpdir: 调用一个能够遍历出文件夹内部文件的函数: 函数就是自己 myScandir($tmpdir,$level+1); //递归点:子问题与父问题一致: 调用父问题的解决方案 } }else{ //文件 echo "<font color='red'>{$file}</font><br/>"; } }//递归出口: foreach遍历完,也没有发现有文件夹 } //调用函数 myScandir('../');
什么就做递归?
当遍历得到一个文件夹内的所有文件的时候: 有可能其中的某个文件就是一个文件夹(.和..除外): 文件夹就是装了文件信息: 当前函数是解决获取一个文件夹内部的所有文件的问题: 将这种在一个大问题(文件夹)的内部出现的小问题(子文件夹)称之为子问题: 子问题与父问题是一样的,只是规模较小而已.
递归
递归: 函数内部调用自己
递归: 当使用一个函数去解决一个大问题的时候,在内部会出现与父问题完全一样(只是规模较小)的子问题, 应该使用与父问题相同的解决方案去解决: 父问题的解决方案就是函数,子问题既然又在父问题内部, 调用父问题的解决方案: 函数内部调用函数自己.
递归有两个要素: 递归点和递归出口
递归点: 子问题出现,需要使用父问题的解决方案: 函数内部调用自己的地方(递归点会导致函数不断的调用自己)
myScandir($tmpdir,$level+1); //递归点:子问题与父问题一致: 调用父问题的解决方案
递归出口: 函数会一直调用自己, 导致内存一直开销, 会导致内存爆掉: 要保证函数不会一直调用自己: 让函数能够结束.
}//递归出口: foreach遍历完,也没有发现有文件夹
//先判断路径是否有效 if(!is_dir($dir)) return false;