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