递归函数是一种调用自己的函数。写递归函数时要小心,因为可能会无穷递归下去。必须确保有充分的方法来终止递归。

一:使用参数引用完成递归函数。操作的是同一块内存地址。

<?php
$i=1;
function test(&$i)
{
echo $i;
$i++;
if ($i < 10){
test($i);
}
}
test($i);//输出123456789
test($i);//输出10 ?>

二:使用全局变量完成递归函数。在函数域内部用 global 语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用。例子中,test()函数内部的 $i 实际上只是程序第一行中($i = 1;)的变量 $i 的一个应用;

<?php
$i = 1;
function test()
{
global $i;
echo $i;
$i++;
if ($i < 10){
test();
}
}
test();//输出123456789
test();//输出10 ?>

三:使用静态变量完成递归函数。static的作用:仅在第一次调用函数的时候对变量进行初始化,并且保留变量值。

<?php
function test()
{
static $i = 1;
echo $i;
  $i++;
if ($i < 10) {
test();
}
$i--;//在每一层递归结束时自减,这一句可以帮助理解递归函数的执行过程
}
test();//输出123456789
test();//输出123456789
?>

例1. 使用全局变量的情况递归遍历文件夹下的所有文件 

function getFiles($dir)
{
global $arr; //引用全局变量
if(is_dir($dir)){
$handle = @opendir($dir);
while($file=readdir($handle)){
if(!in_array($file,array('.', '..'))){
$dirr = $dir.'/'.$file;
if(is_dir($dirr)){
getFiles($dirr); //递归读子目录
}else{
array_push($arr, $dirr);
}
}
}
}
}
$arr = array(); //必须先定义全局变量
getFiles('E:/logs');
print_r($arr); 

例2:使用静态变量的情况递归遍历文件夹下的所有文件

function getFiles ($dir)
{
static $arr = array(); //使用静态变量,防止每次递归都被覆盖
if(is_dir($dir)){
$handle = opendir($dir);
while($file=readdir($handle)){
if(!in_array($file,array('.','..'))){
$dirr = $dir."/".$file;
if(is_dir($dirr)){
getFiles ($dirr);
}else{
array_push($arr,$dirr);
}
}
}
}
return $arr;
}
$rows= array();
$rows = getFiles ('E:/logs');
print_r($rows);

例3:使用 glob() 函数或者 scandir() 函数的情况递归遍历文件夹下的所有文件

function getFiles($dir)
{
static $arr = array(); //使用静态变量,防止每次递归都被覆盖
if(is_dir($dir)){
$handle = glob("$dir/*");
//或者使用scandir() 函数,该函数的作用与 glob() 函数相同
    //$handle = scandir($dir);
foreach($handle as $filename){
if(is_dir($filename)){
getFiles($filename);
}else{
array_push($arr,$filename);
}
}
}
return $arr;
}
$rows= array();
$rows = getFiles ('E:/logs');
print_r($rows);

当然使用glob()函数,还可以定义自获取某类文件,比如只获取 txt文件:glob("$dir/*.txt");

例4:利用递归来执行轮询操作

//轮询3次,进程需要驻守内存
function getCheck($check='要处理的参数',$times = 1)
{
if(!$check){
return 'param error';
}
$url = "https://www.xxxx.com/test.php";
$re = file_get_contents($url);
if($re == 'error'){
$time = time();
echo date('Y-m-d H:i:s',$time).':'.$re.$times."<br>";
$times ++;
if($times<4){
sleep(1);
return getCheck($check,$times);
}else{
return 'time out';
}
}else{
return 'success';
}
}

PHP中递归的实现(附例子)的更多相关文章

  1. NET中MSMQ的使用----附例子

    目录 一:MSMQ的一些理论上的知识 二:队列类型(Queue Type) 三:安装消息队列 四:在C#中Messagequeue class 五:MSMQ-发送消息到远程专用队列 六:例子   一. ...

  2. java中递归的用法和例子

    递归   直接或者间接调用自己, public class Test{    public static void main(String[] args){        int i = 5;    ...

  3. [转]从普通DLL中导出C++类 – dllexport和dllimport的使用方法(中英对照、附注解)

      这几天写几个小程序练手,在准备将一个类导出时,发现还真不知道如果不用MFC的扩展DLL,是怎么导出的.但我知道dllexport可以导出函数和变量,而且MFC扩展DLL就算是使用了MFC的功能,但 ...

  4. ASE存储过程和IQ存储过程的常见区别(附例子)

    ASE存储过程和IQ存储过程的常见区别(附例子) 1 存储过程简介 存储过程(Stored Procedure)是为了完成特定的功能而汇集成一组的SQL语句集,并为该组SQL语句命名.经编译后存储在S ...

  5. Javascript中递归造成的堆栈溢出及解决方案

    关于堆栈的溢出问题,在Javascript日常开发中很常见,Google了下,相关问题还是比较多的.本文旨在描述如何解决此类问题. 首先看一个实例(当然你可以使用更容易的方式实现,这里我们仅探讨递归) ...

  6. 我教女朋友学编程html系列(5) html中table的用法和例子

    女朋友不是学计算机的,但是现在从事计算机行业,做技术支持,她想学习编程,因此我打算每天教她一点点,日积月累,带她学习编程,如果其他初学者感兴趣,可以跟着学. 为了将table介绍的简单.生动,具有实战 ...

  7. java 中递归的实现 以及利用递归方法实现汉诺塔

    今天说下java语言中比较常见的一种方法,递归方法. 递归的定义 简单来说递归的方法就是"自己调用自己",通过递归方法往往可以将一个大问题简单化,最终压缩到一个易于处理的程度.对于 ...

  8. C++ 中递归实现 二项式展开式(a+b)^ n 的表达式

    C++ 中递归实现 二项式展开式 的表达式 前几天,一个数学系读研的同学来问有什么软件可以来求 (a+b)^n 这种表达式类型的展开式,我随口一说了 Octave , 毕竟这个开源的还是可以的,后来他 ...

  9. Android中Service的一个Demo例子

    Android中Service的一个Demo例子  Service组件是Android系统重要的一部分,网上看了代码,很简单,但要想熟练使用还是需要Coding.  本文,主要贴代码,不对Servic ...

  10. 【ABAP系列】SAP ABAP中ALV使用HTML的例子

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP中ALV使用HT ...

随机推荐

  1. C++ delegate的几种方法

    https://stackoverflow.com/questions/9568150/what-is-a-c-delegate You have an incredible number of ch ...

  2. QPS从0到4000请求每秒,谈达达后台架构演化之路(转载)

    https://blog.csdn.net/czbing308722240/article/details/52350219 QPS从0到4000请求每秒,谈达达后台架构演化之路   达达是全国领先的 ...

  3. CentOS7配置MySQL5.7主备

    1:主库设置(1)修改配置文件vi /etc/my.cnf[mysqld]log-bin=master-binserver-id=1 (2)创建用户#mysql -u root -pmysql> ...

  4. sed 替换多个空格为一个

    sed -i 's/[ ][ ]*/ /g'  file.txt

  5. 信用评分及模型原理解析(以P2P网贷为例)

    本博文将针对消费贷款领域的信用评分及其模型进行相关研究探讨.虽然人人都可以通过对借款方在Lending Club(国外最大的P2P网站)和Prosper上的历史借贷数据进行分析,但我相信,了解消费信贷 ...

  6. spring拦截器中使用spring的自动注入

    需要在spring的拦截器中使用自定义的服务,这要就设计到将服务注入到拦截器中.网上看的情况有两种: 1. @Configuration public class OptPermissionHandl ...

  7. Rabbit五种消息队列学习(一) – 总述

    RabbitMQ支持五种消息传递类型,分别如下图所示: 上图中显示6中消息队列分别为: 1.简单队列 一个生产者将消息放到队列中,一个消费者监听队列 2.工作队列(Work queues) 一个生产者 ...

  8. Android 隐藏系统状态栏

    通常的做法是这样的: private static boolean isStatusbarVisible(Activity activity) { int uiOptions = activity.g ...

  9. 模拟真实点击click,专门对付clickoutside

    var evmousedown = document.createEvent('HTMLEvents'); // evmousedown.clientX = 88 // evmousedown.cli ...

  10. https认证握手过程