PHP实现递归函数的基本方式有3种,用PHP递归实现无限分类
当你学习递归函数时,你无法弄清楚递归函数的原理和运行机制。递归函数是一种常用的函数类型,最基本的特征是函数调用自身,但在调用自身之前必须对其进行条件求值。如果满足条件,则调用函数本身。如果不是,则终止该函数的自调用,然后将当前进程的控制权返回给上一层。函数,否则将无限期地调用。我们首先介绍一下PHP中实现递归函数的三种基本方式。
1。使用引用作为参数
不管引用是否是参数,首先要明白什么是引用?引用只是意味着两个不同名称的变量指向同一个存储地址。本来每个变量都有自己的存储地址,设置和删除各走各的路。好了,现在这两个变量共享一个存储地址。 $a=&$b; 。它实际上意味着$a必须与$b共享相同的空间,无论原始存储地址如何。因此,对存储地址值的任何更改都会影响这两个值。函数本来就是它们自己的东西,即使它们有相同的名字。递归函数考虑以引用作为参数,成为两个函数之间形成数据交换的桥梁。虽然这两个函数看似操作不同的地址,但实际上操作的是同一个内存地址。function test($a=0,&$result=array()){
$a++;
if ($a<10) {
$result[]=$a;
test($a,$result);
}
echo $a;
return $result;
}
上面的例子很简单。使用 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [ 6] => 7 [7] => 8 [8] => 9)。这个例子中更有趣的是 echo a 的值。相信很多人都以为是12345678910,其实不是,是1098765432,为什么呢?因为该函数在 echoa 之前执行了下一个函数递归。 echo a 的实际执行是如果不满足条件 a 2。使用全局变量 使用全局变量来完成递归函数。确保您了解什么是全局变量。函数中声明的全局变量只是对同名外部变量的引用。变量的作用域仍在该函数的作用域内。改变这些变量的值自然会改变同名的外部变量的值。但一旦使用了&,同名变量就不再是同名引用了。使用全局变量实现递归函数并不需要理解这么深。通过保留全局变量的原始视图,您可以自然地理解递归函数。
function test($a=0,$result=array()){
global $result;
$a++;
if ($a<10) {
$result[]=$a;
test($a,$result);
}
return $result;
}
3。使用静态变量
我们经常在类中看到静态变量,今天我们在递归函数中使用它。记住static的作用:仅在第一次调用函数时初始化变量,并保留变量值。例如:function test(){
static $count=0;
echo $count;
$count++;
}
test();
test();
test();
test();
test();
这段代码的执行结果是什么?是00000吗?当然不。是01234。首先,第一次调用Test()时,静态初始化$count。后续每次执行后,$count的值都会保留,不再初始化,相当于立即忽略语句static $count=0;。因此,将static应用于递归函数的效果可想而知。必须用作递归函数之间“桥梁”的变量使用 static 进行初始化,并且为每次递归保留“桥梁变量”的值。
function test($a=0){
static $result=array();
$a++;
if ($a<10) {
$result[]=$a;
test($a);
}
return $result;
}
总结
所谓递归函数,重点在于如何处理函数调用本身,以及如何保证所需的结果能够在函数之间合理地“传递”。当然,也有不需要函数间传值的递归函数,如:function test($a=0){
$a++;
if ($a<10) {
echo $a;
test($a);
}
}
PHP函数递归调用示例
function arrContentReplact($array)
{
if(is_array($array))
{
foreach($array as $k => $v)
{
$array[$k] = arrContentReplact($array[$k]);
}
}else
{
$array = str_replace(
array('<', '>'),
array('{', '}'),
$array
);
}
return $array;
}
$arr = array(array("< 小刚>","< 小晓>",array("<小强>",array("<浪人>"))),"< 小飞>","< 小李>","< 小红>");
$arr3 = arrContentReplact($arr);
echo "
";
print_r($arr3);
echo "
";
?>
PHP实现递归无限分类
在一些复杂系统中,信息列的无限分类是改进系统的灵活性所必需的。那么PHP是如何实现无限分类的呢?下面介绍利用递归算法结合mysql数据表实现无限分类的方法。1。 Mysql首先我们准备一个数据表类来记录商品分类信息。表中有三个字段,ID:类别号,主键自动增长;标题:类别名称; pid:所属上级类别的ID。类表结构:
CREATE TABLE IF NOT EXISTS `class` (
`id` mediumint(6) NOT NULL AUTO_INCREMENT,
`title` varchar(30) NOT NULL,
`pid` mediumint(6) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
输入数据后,如图:
2、PHP根据不同需求,我们提供两种不同格式的自定义函数,一种是返回字符串,一种是返回字符串是要返回的数组,两个函数都使用递归方法。首先我们看一下返回字符串格式的函数:
function get_str($id = 0) {
global $str;
$sql = "select id,title from class where pid= $id";
$result = mysql_query($sql);//查询pid的子类的分类
if($result && mysql_affected_rows()){//如果有子类
$str .= '<ul>';
while ($row = mysql_fetch_array($result)) { //循环记录集
$str .= "<li>" . $row['id'] . "--" . $row['title'] . "</li>"; //构建字符串
get_str($row['id']); //调用get_str(),将记录集中的id参数传入函数中,继续查询下级
}
$str .= '</ul>';
}
return $str;
}
上面的函数get_str()使用递归不断请求低层分类,最终返回一个字符串。可以根据项目需要改变str,最终生成无限层次列表:
include_once('connect.php'); //连接数据库,connect.php文件自己写一个啊
echo get_str(0); //输出无限级分类
效果如图: 
function get_array($id=0){
$sql = "select id,title from class where pid= $id";
$result = mysql_query($sql);//查询子类
$arr = array();
if($result && mysql_affected_rows()){//如果有子类
while($rows=mysql_fetch_assoc($result)){ //循环记录集
$rows['list'] = get_array($rows['id']); //调用函数,传入参数,继续查询下级
$arr[] = $rows; //组合数组
}
return $arr;
}
}
get_array()函数返回一个数组,这正是我们所期望的,所以建议使用get_array()来获取数组,像这样首先我们可以对大批。例如,我们可以将数组转换为json格式数据并传递给前端页面。前端页面可以通过解析json数据来展示灵活的分类信息。例如,树形结构的类别列表、下拉类别列表等。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。