61阅读

php递归算法-详细的介绍一下PHP递归算法

发布时间:2017-08-31 所属栏目:线程实现的两种方式

一 : 详细的介绍一下PHP递归算法

PHP递归算法代码:

复制代码代码如下:
< ?php
//定义PI一分的角度的值 define("PII",M_PI/180);
//新建图像资源,并定义其背景为白色,前景色为黑色
$im=imagecreate(670,500);
$white=imagecolorallocate($im,0xFF,0xFF,0xFF);
$g=imagecolorallocate($im,0x00,0x00,0x00);
//从下面实例化的代码可以得知,初始值$x,$y,$L,$a别分为300,500,100,270
functiondrawLeaf($g,$x,$y,$L,$a)
{ global$im; $B=50; $C=9; $s1=2; $s2=3; $s3=1.2;
if($L>$s1){
//计算叶子的定位上面
$x2=$x+$L*cos($a*PII);
$y2=$y+$L*sin($a*PII);
$x2R=$x2+$L/$s2*cos(($a+$B)*PII);
$y2R=$y2+$L/$s2*sin(($a+$B)*PII);
$x2L=$x2+$L/$s2*cos(($a-$B)*PII);
$y2L=$y2+$L/$s2*sin(($a-$B)*PII);
//计算叶子的定位下面
$x1=$x+$L/$s2*cos($a*PII);
$y1=$y+$L/$s2*sin($a*PII);
$x1L=$x1+$L/$s2*cos(($a-$B)*PII);
$y1L=$y1+$L/$s2*sin(($a-$B)*PII);
$x1R=$x1+$L/$s2*cos(($a+$B)*PII);
$y1R=$y1+$L/$s2*sin(($a+$B)*PII);
//别分画叶子的主干以及叶面
ImageLine($im,(int)$x,(int)$y,(int)$x2,(int)$y2,$g);
ImageLine($im,(int)$x2,(int)$y2,(int)$x2R,(int)$y2R,$g);
ImageLine($im,(int)$x2,(int)$y2,(int)$x2L,(int)$y2L,$g);
ImageLine($im,(int)$x1,(int)$y1,(int)$x1L,(int)$y1L,$g);
ImageLine($im,(int)$x1,(int)$y1,(int)$x1R,(int)$y1R,$g);
//再次递归调用本身
drawLeaf($g,$x2,$y2,$L/$s3,$a+$C);
drawLeaf($g,$x2R,$y2R,$L/$s2,$a+$B);
drawLeaf($g,$x2L,$y2L,$L/$s2,$a-$B);
drawLeaf($g,$x1L,$y1L,$L/$s2,$a-$B);
drawLeaf($g,$x1R,$y1R,$L/$s2,$a+$B);
}
}
//实例化
drawLeaf($g,300,500,100,270);
header("Content-type:image/png");
imagepng($im);
?>

在我个人的PHP编程经验中,递归调用常常与静态变量使用。静态变量的含义可以参考PHP手册。希望下面的代码,会更有利于对PHP递归算法以及静态变量的理解
复制代码代码如下:
header("Content-type:text/plain"); functionstatic_function()
{
static$i=0;
if($i++<10)
{
echo$i."\n";
static_function();
}
}
static_function();

这段PHP递归算法代码会如数输出1到10的数字。在static_function函数第二次运行时,变量i由于是静态变量,所以仍被保留不被释放,进而可以得到自增的值。

二 : Ztree + PHP 无限极节点 递归查找节点法

一、前言

简单的描述一下,实习几个原理,思想,其实写很多东西,思想算是最重要的。

1、目标:将写一个无限节点的树形目录结构,如下图

Ztree + PHP 无限极节点 递归查找节点法_ztree

步骤:

1、你的下载 插件 ztree。然后布置在你的项目中。

  1. <scriptsrc="__PUBLIC__/js/jquery-1.4.4.min.js"></script>
  2. <scriptsrc="__PUBLIC__/js/jquery.ztree.core-3.5.js"></script>

2、相关CSS

  1. <linkrel="stylesheet"href="__PUBLIC__/css/zTreeStyle/zTreeStyle.css"type="text/css">
  2. <linkrel="stylesheet"href="__PUBLIC__/css/zTree.css"type="text/css">

以上CSS 和JS 以你自己的为准。

3、目录结构DIV

  1. <divclass="content_wrap"style="background:#666;">
  2. <divclass="zTreeDemoBackgroundleft">
  3. <ulid="treeDemo"class="ztree"></ul>
  4. </div>
  5. </div>
  6. <divclass="content-text"id="text"></div>

4,自己单独js中的代码

  1. <SCRIPTsrc="__PUBLIC__/js/ztreeonload.js"></SCRIPT>

里面写的相关功能 及配置!

  1. //配置项
  2. varsetting={
  3. isSimpleData:true,//数据是否采用简单Array格式,默认false性
  4. showLine:true,//是否显示节点间的连线
  5. checkable:true,
  6. callback:{
  7. onClick:zTreeOnClick
  8. }
  9. };
  10. varzNodes;//数据变量
  11. //ajax提交数据,请求后台PHP处理返回出目录结构json数据
  12. $.ajax({
  13. url:"/admin.php/Ztree",
  14. type:"get",
  15. async:false,
  16. dataType:"json",
  17. success:function(data){
  18. //alert(data);
  19. zNodes=data;//将请求返回的数据存起来
  20. //alert(zNodes);
  21. },
  22. error:function(){//请求失败处理函数
  23. alert('请求失败');
  24. },
  25. })
  26. //初始化ztree目录结构视图!
  27. $(document).ready(function(){
  28. //alert("111");
  29. $.fn.zTree.init($("#treeDemo"),setting,zNodes);
  30. });

5、后台PHP 递归算法,从数据库中查找目录结构并且生成 JSON数据

地址:如4中,AJAX所请求的 【/admin.php/Ztree】我这里是用的ThinkPHP框架,所以url是这个样子,以你自己的接口文件为准!

  1. <?php
  2. //父节点数组
  3. $arr=array();
  4. $arr_str0=array("name"=>'函数库查询','children'=>$this->SelectSon(1));//父节点Pid=1;
  5. $arr_str1=array("name"=>'数据库查询','children'=>$this->SelectSon(2));//父节点Pid=2;
  6. array_push($arr,$arr_str0);
  7. array_push($arr,$arr_str1);//这里是2个父节点。
  8. echo(json_encode($arr));//这是最后返回给页面,也就是返回给AJAX请求后所得的返回数据JSON数据
  9. ?>
  10. //这里仅仅是一个方法,一个调用SelectSon()方法,返回一个数组集合!但其中用的是递归!
  11. <?php
  12. //查找子节点Pid=父节点ID
  13. privatefunctionSelectSon($Pid){
  14. $m=M('ztree');
  15. if(($info=$m->where("Pid='$Pid'")->select()))//查找该父ID下的子ID
  16. {
  17. $data=array();
  18. for($i=0;$i<count($info);$i++)
  19. {
  20. $da=array("name"=>$info[$i]['name'],'children'=>$this->SelectSon($info[$i]['id']));//递归算法!
  21. array_push($data,$da);//加入子节点数组
  22. };
  23. return$data;//一次性返回子节点数组,他们成为同级子节点。
  24. }
  25. else
  26. {
  27. returnnull;
  28. }
  29. }
  30. ?>

注意:由于我是用的thinkphp框架。所以在方法调用上 有些不同,纯PHP文件中,思路应该是一样的,

首先是: 写一个数组。一个父节点的数组。

其次: 写一个方法,传递的参数是 父节点的ID,查询其子节点,在子节点中查询之后,用递归的方式继续查找子节点的子节点,直到最后查询完毕之后,返回数组给调用方法的父节点数组。然后再

  1. echo(json_encode($arr));

转码成 JSON 将其输出,以便于AJAX异步访问,得到JSON数据。

得到之后,回到刚刚的JS功能代码中,直接初始化树目录结构,将其JSON数据传入OK。

总结:

其主要思想分2步走。第一步,是如何能把目录生成出来。先测试时,可以用静态数据。类似于

  1. varnode=[
  2. {name:'父节点',children:[{name:'子节点',children:null},{name:'同级子节点',children:null}]}
  3. ]
  4. 先分析一下,这串数据,他有什么规律。你就会发现。其实很有规律。无限节点,其实就是每个json中,有children,而且
  5. 还有同级子节点。

你先用固定数据 生成目录结构之后

你就可以开始考虑,动态的向node传目录结构的数据了。就是我们后面所谓的 AJAX请求 PHP得到JSON数据,

PHP处理中,我用的是递归算法,返回JSON数据。及完成了。目录结构。

哦对了。

  1. $m=M('ztree');

这句代码是thinkphp 实例化 数据操作对象的。

用来查询数据库中,节点是否存在。就是存在子节点,就返回给子节点数组,有几个就加入子节点数组中,查询完了。然后一次性返回,他们就成了同级子节点了。

三 : php实现递归与无限分类的方法

这篇文章主要介绍了php实现递归与无限分类的方法,涉及php的递归操作技巧,需要的朋友可以参考下

本文实例讲述了php实现递归与无限分类的方法,分享给大家供大家参考。具体实现方法如下:<?php

echo "<pre>";

$area = array(

array('id'=>1,'area'=>'北京','pid'=>0),

array('id'=>2,'area'=>'广西','pid'=>0),

array('id'=>3,'area'=>'广东','pid'=>0),

array('id'=>4,'area'=>'福建','pid'=>0),

array('id'=>11,'area'=>'朝阳区','pid'=>1),

array('id'=>12,'area'=>'海淀区','pid'=>1),

array('id'=>21,'area'=>'南宁市','pid'=>2),

array('id'=>45,'area'=>'福州市','pid'=>4),

array('id'=>113,'area'=>'亚运村','pid'=>11),

array('id'=>115,'area'=>'奥运村','pid'=>11)[www.61k.com),

array('id'=>234,'area'=>'武鸣县','pid'=>21)

);

function t($arr,$pid=0,$lev=0){

static $list = array();

foreach($arr as $v){

if($v['pid']==$pid){

echo str_repeat(" ",$lev).$v['area']."<br />";

//这里输出,是为了看效果

$list[] = $v;

t($arr,$v['id'],$lev+1);

}

}

return $list;

}

$list = t($area);

echo "<hr >";

print_r($list);

?>

希望本文所述对大家的php程序设计有所帮助。

四 : PHP使用递归算法无限遍历数组示例

本文实例讲述了PHP使用递归算法无限遍历数组。分享给大家供大家参考,具体如下:

PS:为方便阅读,此处代码使用php代码格式化工具http://tools.61k.com/code/phpformat进行了格式化处理)

 <?php //无限遍历数组 $a1 = array("a", "b", "c"); //一维数组 $a2 = array(array(21, 3, 6), array("a", "b", "c")); //二维数组 $a3 = array(array(array(5, 55), 4, 444), 2, 7, 6, 8, array("w", "d", array(3, 2, "a"), "s")); //多维不规则数组 function fun($a) {  foreach ($a as $val) {  if (is_array($val)) { //如果键值是数组,则进行函数递归调用  fun($val);  } else { // 如果键值是数值,则进行输出  echo "$val<br />";  } //end if  } //end foreach  } //end fun //fun($a1); //fun($a2); fun($a3); ?>

输出:

 5 55 4 444 2 7 6 8 w d 3 2 a s 

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数据结构与算法教程》、《php程序设计算法总结》、《php排序算法总结》、《PHP常用遍历算法与技巧总结》、《PHP数学运算技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

五 : PHP两种实现无级递归分类的方法

话不多说,请看代码:

 /** * 无级递归分类 TP框架 * @param int $assortPid 要查询分类的父级id * @param mixed $tag 上下级分类之间的分隔符 * @return string $tree 返回的分类树型结构结果 * */ function recursiveAssort($assortPid, $tag = '') { $assort = M('goods_class')->where("class_pid = $assortPid")->field('class_id, class_name')->select();  foreach ($assort as $value) {  $tree .= '<option value="' . $value['class_id'] . '">' . $tag . $value['class_name'] . '</option>';  $tree .= recursiveAssort($value['class_id'], $tag . ' ');  }  return $tree; }

 /**  * 利用php的引用传递 CI框架  *  */  public function get_access()  {  $access = array();  $field = 'id, pid, method, name, description';  $q_access = $this->db->select($field)->get('access');  $q_result = $q_access->result_array();  if (!empty($q_result)) {  $items = array();  foreach ($q_result as $value) {  $items[$value['id']] = $value;  }  foreach ($items as $key => $item) {  if ($item['pid'] == 0) {  $access[] = &$items[$key];  } else {  $items[$item['pid']]['sub_access'][] = &$items[$key];  }  }  }  return $access;  } 

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持61阅读!

本文标题:php递归算法-详细的介绍一下PHP递归算法
本文地址: http://www.61k.com/1105039.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1