PHP中递归的实现(附例子)
递归函数是一种调用自己的函数。写递归函数时要小心,因为可能会无穷递归下去。必须确保有充分的方法来终止递归。
一:使用参数引用完成递归函数。操作的是同一块内存地址。
<?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中递归的实现(附例子)的更多相关文章
- NET中MSMQ的使用----附例子
目录 一:MSMQ的一些理论上的知识 二:队列类型(Queue Type) 三:安装消息队列 四:在C#中Messagequeue class 五:MSMQ-发送消息到远程专用队列 六:例子 一. ...
- java中递归的用法和例子
递归 直接或者间接调用自己, public class Test{ public static void main(String[] args){ int i = 5; ...
- [转]从普通DLL中导出C++类 – dllexport和dllimport的使用方法(中英对照、附注解)
这几天写几个小程序练手,在准备将一个类导出时,发现还真不知道如果不用MFC的扩展DLL,是怎么导出的.但我知道dllexport可以导出函数和变量,而且MFC扩展DLL就算是使用了MFC的功能,但 ...
- ASE存储过程和IQ存储过程的常见区别(附例子)
ASE存储过程和IQ存储过程的常见区别(附例子) 1 存储过程简介 存储过程(Stored Procedure)是为了完成特定的功能而汇集成一组的SQL语句集,并为该组SQL语句命名.经编译后存储在S ...
- Javascript中递归造成的堆栈溢出及解决方案
关于堆栈的溢出问题,在Javascript日常开发中很常见,Google了下,相关问题还是比较多的.本文旨在描述如何解决此类问题. 首先看一个实例(当然你可以使用更容易的方式实现,这里我们仅探讨递归) ...
- 我教女朋友学编程html系列(5) html中table的用法和例子
女朋友不是学计算机的,但是现在从事计算机行业,做技术支持,她想学习编程,因此我打算每天教她一点点,日积月累,带她学习编程,如果其他初学者感兴趣,可以跟着学. 为了将table介绍的简单.生动,具有实战 ...
- java 中递归的实现 以及利用递归方法实现汉诺塔
今天说下java语言中比较常见的一种方法,递归方法. 递归的定义 简单来说递归的方法就是"自己调用自己",通过递归方法往往可以将一个大问题简单化,最终压缩到一个易于处理的程度.对于 ...
- C++ 中递归实现 二项式展开式(a+b)^ n 的表达式
C++ 中递归实现 二项式展开式 的表达式 前几天,一个数学系读研的同学来问有什么软件可以来求 (a+b)^n 这种表达式类型的展开式,我随口一说了 Octave , 毕竟这个开源的还是可以的,后来他 ...
- Android中Service的一个Demo例子
Android中Service的一个Demo例子 Service组件是Android系统重要的一部分,网上看了代码,很简单,但要想熟练使用还是需要Coding. 本文,主要贴代码,不对Servic ...
- 【ABAP系列】SAP ABAP中ALV使用HTML的例子
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP中ALV使用HT ...
随机推荐
- EBS WebADI 存储过程增加参数
CREATE OR REPLACE FUNCTION CUX_EXEC_SQL (P_SQL IN VARCHAR2) RETURN NUMBERAS L_CNT NUMBER;BEGIN ...
- 国际化之Android设备支持的语种
昨天发了关于iOS支持的语种,文章最后也补了安卓支持语种列表.但最后发现安卓设备支持跟它列的有出入,我重新完全手工整理了一遍. 我将对应的语种在安卓的语言列表里的显示,也全部逐一列出来了,方便大家到时 ...
- linux:gpg加密和解密
http://www.bubuko.com/infodetail-650747.html
- 使用Mybatis时mybatis-config.xml配置中"configuration" 的内容必须匹配 (.....)解决方案
一.简述 使用Mybatis配置mybatis-config配置文件时,经常遇到下列报错信息:org.xml.sax.SAXParseException; lineNumber: 36; column ...
- M600 Pro 安装问题解决
1.遥控器版本为1.2.10 提示版本已是最新版本,那么Lightbridge2 必须是1.1.60 不能是1.1.70 2.卸载机翼的时候,尽量用飞机带的那把工具 3.机翼安装 135 逆时针 cc ...
- sql中的left join以及on、where关键字的区别
创建两张表并插入一些数据 create table class( class_id int, class_name ), class_grade ) ); ,'语文','A'); ,'数学','B') ...
- moving-files-from-one-linux-server-to-another-using-scp
https://www.tecmint.com/scp-commands-examples/ https://haydenjames.io/linux-securely-copy-files-usin ...
- Spring-boot之 swagger2
Swagger是一个简单但功能强大的API表达工具. 结合springboot 配置起来很简单,附上教程 :https://www.xncoding.com/2017/07/08/spring/sb- ...
- 具体解释MVP矩阵之ViewMatrix
矩阵推导 ViewMatrix用于直接将World坐标系下的坐标转换到Camera坐标系下.已知相机的坐标系.还有相机在世界空间下的坐标.就能够求出ViewMatrix.以下进行具体推导. 令UVN为 ...
- 【C语言】 重拾
[C语言] 因为以前学过C语言,只不过太长时间不用,已经忘得差不多了… 所以这篇文章的性质是把C语言中一些对于现在的我不是很符合预期的知识点记录一下. ■ HelloWorld程序 HelloWorl ...