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("&nbsp;",$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;

 

posted @ 2015-11-10 23:53  黑夜中晚霞  阅读(202)  评论(0编辑  收藏  举报