php递归实例

    递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

    下面举4个递归的实例:

<?php
    
    /*
        递归的实例
        1、统计数组元素个数
        php也可以直接使用count($arr,1) 来计算多维数组的元素的个数
        2、统计文件和文件夹数量
        3、删除文件或文件夹
        用到的系统函数:file_exists()检查目录或者文件是否存在 unlink()删除文件 rmdir()删除目录
        4、无限极分类的排序
    */

    /**
    * 递归共计数组元素个数
    * @param array $arr 统计的数组
    * @return boolean|int  如果失败返回false,成功返回数组的元素个数
    */
    function conarr($arr){
        function funtmp($arr,$sum=0){
            if(is_array($arr)){
                $sum=count($arr);
            }else{
                return count($arr);
            }
            foreach($arr as $k=> $v){
                if(is_array($v)){
                    $sum += funtmp($v,$sum);
                }
            }
            return $sum;
        }
        return funtmp($arr);
    }
    // $arr = array(1,2,3,4,array(1,2,3,array(0,3)));
    // echo conarr($arr).'<br/>';
    // echo count($arr,1);

    /**
    * 递归统计指定目录的子文件的个数和文件夹个数
    * @param $dirname string 目录路径
    * @return array|boolean 返回包含子文件个数和文件夹个数的数组,失败返回false
    */
    function condir($dirname,$data = array('dirnum'=>0,'filenum'=>0)){
        if(!is_dir($dirname)){
            return false;
        }
        $dir = opendir($dirname); //打开句柄
        readdir($dir);//读取点
        readdir($dir);//读取点
        while($filename = readdir($dir)){
            $newfile = $dirname.'/'.$filename;//拼接子文件名
            if(is_dir($newfile)){
                $data['dirnum']++;
                $data['dirnum']+=condir($newfile)['dirnum'];
                $data['filenum']+=condir($newfile)['filenum'];
            }else{
                $data['filenum']++;
            }
        }
        return $data;
    }
    //$a =  condir('C:\wamp\www\test');
    //var_dump($a);

    /**
    * 删除文件或者文件夹
    * @param string $dirname 文件路径
    * @return boolean 删除成功返回true,失败返回false
    */
    function delDir($dirname){
        if(!file_exists($dirname)){return false;}
        if($dir = opendir($dirname)){
            while($filename = readdir($dir)){
                if($filename !="."&& $filename !='..'){
                    $subFile = $dirname.'/'.$filename;
                    if(is_dir($subFile)){
                        delDir($subFile);
                    }
                    if(is_file($subFile)){
                        unlink($subFile);
                    }
                }
            }    
            closedir($dir);
            rmdir($dirname);
        }
        if(!file_exists($dirname)){
            return true;
        }else{
            return false;
        }
    }
    //echo delDir('C:\wamp\www\test');


    //无限极分类排序,父类后跟子类
    function getlist($cate,$pid=0,$html="------",$i=0){
        $i++;
        $list = array();
        foreach($cate as $val){
            if($val['pid']==$pid){
                $val['html']=str_repeat($html,$i-1);
                $list[]=$val;
                $list = array_merge($list,getlist($cate,$val['id'],$html,$i));
            }
        }
        return $list;
    }
?>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值