php递归实例

php中文网
发布: 2016-07-29 09:14:56
原创
1234人浏览过

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

    下面举4个递归的实例:

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

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

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

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


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


ViiTor实时翻译
ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译 116
查看详情 ViiTor实时翻译

以上就介绍了php递归实例,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号