一 : 详细的介绍一下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、目标:将写一个无限节点的树形目录结构,如下图
步骤:
1、你的下载 插件 ztree。然后布置在你的项目中。
- <scriptsrc="__PUBLIC__/js/jquery-1.4.4.min.js"></script>
- <scriptsrc="__PUBLIC__/js/jquery.ztree.core-3.5.js"></script>
2、相关CSS
- <linkrel="stylesheet"href="__PUBLIC__/css/zTreeStyle/zTreeStyle.css"type="text/css">
- <linkrel="stylesheet"href="__PUBLIC__/css/zTree.css"type="text/css">
以上CSS 和JS 以你自己的为准。
3、目录结构DIV
- <divclass="content_wrap"style="background:#666;">
- <divclass="zTreeDemoBackgroundleft">
- <ulid="treeDemo"class="ztree"></ul>
- </div>
- </div>
- <divclass="content-text"id="text"></div>
4,自己单独js中的代码
- <SCRIPTsrc="__PUBLIC__/js/ztreeonload.js"></SCRIPT>
里面写的相关功能 及配置!
- //配置项
- varsetting={
- isSimpleData:true,//数据是否采用简单Array格式,默认false性
- showLine:true,//是否显示节点间的连线
- checkable:true,
- callback:{
- onClick:zTreeOnClick
- }
- };
- varzNodes;//数据变量
- //ajax提交数据,请求后台PHP处理返回出目录结构json数据
- $.ajax({
- url:"/admin.php/Ztree",
- type:"get",
- async:false,
- dataType:"json",
- success:function(data){
- //alert(data);
- zNodes=data;//将请求返回的数据存起来
- //alert(zNodes);
- },
- error:function(){//请求失败处理函数
- alert('请求失败');
- },
- })
- //初始化ztree目录结构视图!
- $(document).ready(function(){
- //alert("111");
- $.fn.zTree.init($("#treeDemo"),setting,zNodes);
- });
5、后台PHP 递归算法,从数据库中查找目录结构并且生成 JSON数据
地址:如4中,AJAX所请求的 【/admin.php/Ztree】我这里是用的ThinkPHP框架,所以url是这个样子,以你自己的接口文件为准!
- <?php
- //父节点数组
- $arr=array();
- $arr_str0=array("name"=>'函数库查询','children'=>$this->SelectSon(1));//父节点Pid=1;
- $arr_str1=array("name"=>'数据库查询','children'=>$this->SelectSon(2));//父节点Pid=2;
- array_push($arr,$arr_str0);
- array_push($arr,$arr_str1);//这里是2个父节点。
- echo(json_encode($arr));//这是最后返回给页面,也就是返回给AJAX请求后所得的返回数据JSON数据
- ?>
- //这里仅仅是一个方法,一个调用SelectSon()方法,返回一个数组集合!但其中用的是递归!
- <?php
- //查找子节点Pid=父节点ID
- privatefunctionSelectSon($Pid){
- $m=M('ztree');
- if(($info=$m->where("Pid='$Pid'")->select()))//查找该父ID下的子ID
- {
- $data=array();
- for($i=0;$i<count($info);$i++)
- {
- $da=array("name"=>$info[$i]['name'],'children'=>$this->SelectSon($info[$i]['id']));//递归算法!
- array_push($data,$da);//加入子节点数组
- };
- return$data;//一次性返回子节点数组,他们成为同级子节点。
- }
- else
- {
- returnnull;
- }
- }
- ?>
注意:由于我是用的thinkphp框架。所以在方法调用上 有些不同,纯PHP文件中,思路应该是一样的,
首先是: 写一个数组。一个父节点的数组。
其次: 写一个方法,传递的参数是 父节点的ID,查询其子节点,在子节点中查询之后,用递归的方式继续查找子节点的子节点,直到最后查询完毕之后,返回数组给调用方法的父节点数组。然后再
- echo(json_encode($arr));
转码成 JSON 将其输出,以便于AJAX异步访问,得到JSON数据。
得到之后,回到刚刚的JS功能代码中,直接初始化树目录结构,将其JSON数据传入OK。
总结:
其主要思想分2步走。第一步,是如何能把目录生成出来。先测试时,可以用静态数据。类似于
- varnode=[
- {name:'父节点',children:[{name:'子节点',children:null},{name:'同级子节点',children:null}]}
- ]
- 先分析一下,这串数据,他有什么规律。你就会发现。其实很有规律。无限节点,其实就是每个json中,有children,而且
- 还有同级子节点。
你先用固定数据 生成目录结构之后
你就可以开始考虑,动态的向node传目录结构的数据了。就是我们后面所谓的 AJAX请求 PHP得到JSON数据,
PHP处理中,我用的是递归算法,返回JSON数据。及完成了。目录结构。
哦对了。
- $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递归算法61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1