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

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

<?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. Github超棒资源汇总

    Awesome List 中文资源大全 经典编程书籍大全 免费的编程中文书籍索引 awesome-awesomeness-zh_CN https://github.com/jnv/lists awes ...

  2. 【jQuery Demo】图片切换效果整理

    图片的切换效果有很多,比较常见的有水平滚动.垂直滚动.淡入淡出等.我们接下来一一实现这些效果. 1.水平滚动 1) 我们先来实现HTML页面,代码很简单: <div id="conta ...

  3. ZABBIX 4.0 LTS 部署

    1. 环境说明 关于zabbix的详细使用可以参考之前的3.0 版本,该文档仅记录zabbix 4.0 编译安装过程!ZABBIX 3.0 从入门到精通(zabbix使用详解) : https://w ...

  4. Latex中cls和sty文件有何区别?

    Latex中cls和sty文件有何区别? 资源 本文对 LaTeX 中 .cls 和 .sty 文件进行介绍,主要参考了 What are .cls and .sty files?How are th ...

  5. 在WPF中的Canvas上实现控件的拖动、缩放

    如题,项目中需要实现使用鼠标拖动.缩放一个矩形框,WPF中没有现成的,那就自己造一个轮子:) 造轮子前先看看Windows自带的画图工具中是怎样做的,如下图: 在被拖动的矩形框四周有9个小框,可以从不 ...

  6. 如何在宿主机上查看kvm虚拟机的IP

    # arp -a ? (:3c:ce::f2: [ether] on br0 gateway (:c8:ac:d5 [ether] on br0 ? (:d4:fc: [ether] on br0 ? ...

  7. go 资料

    channel 底层原理 https://www.youtube.com/watch?v=KBZlN0izeiY go concurrency https://www.youtube.com/watc ...

  8. mongodb配置文件解说(转载)

    启动方式 ./bin/mongod -f mongodb.conf 会看到 about to fork child process, waiting until server is ready for ...

  9. 【Log】SLF4J简单入门

    SLF4J介绍 SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.按照官方的说法,SLF4J是一个用于日 ...

  10. python:print输出内容大拼接,重新认识 + 和 ,

    加号 + 和 逗号, 都可以用来拼接print的输出内容,但是两者也是有区别的. 加号拼接: print ('zwf'+'wk') 1 1 结果: zwfwk 1 1 逗号拼接: print ('zw ...