玩转php递归函数:php递归函数返回值问题终极解决办法

发布时间:2020-11-10编辑:脚本学堂
在php递归函数中,经常会遇到递归函数无返回值的问题,那么在php实现的递归中如何正确处理返回值呢,php递归函数无返回值怎么办,可以参考下本文的实例分析。

一、php递归函数的返回值

例1:
 

复制代码 代码示例:

function test($i){
 $i-=4;
 if($i<3) {
  return $i;
 }else{

test($i);
 }
}

echo test(30)."&nbsp;";

注意,以上代码中else内里是有问题的,条件$i<3时return$i所有函数照样不会返回值的。

例2,修改php递归函数为:
 

复制代码 代码示例:

function test($i){
 $i-=4;
 if($i<3) {
  return $i;
 }else{

 return test($i);
 }
}

echo test(30)."&nbsp;";

二、php递归函数返回值问题

要统计无限分类中,父类下的所有子类的总数(包括孙类,重孙类...),但是递归函数无法获得正确的返回值(因为每递归一次,就Return一次)。
怎么解决这个问题呢?

例子:
 

复制代码 代码示例:
function countSort($pid)
{
  $countsort_sql = "SELECT * FROM `{$db_table}newssort` WHERE `newssort_pid` = '$pid'";
  $countsort_result = mysql_query($countsort_sql) or die('数据库查询失败,请与管理员联系!');
  $countsort_number += mysql_num_rows($countsort_result);
 
  if($countsort_number > 0)
  {
    while($countsort_row = mysql_fetch_assoc($countsort_result))
    {
      countSort($countsort_row['newssort_id']);
    }
  }
 
    return $countsort_number;
}

问题的确出在将$countsort_number定义为全局变量,所以每次循环都会改变.

但是,如果不把$countsort_number定义为全局变量的话,整个递归函数得到的值将会是0,因为这个变量是在函数内使用的.

所以现在产生了这个冲突:
1.如果global,在while内无法正常运行.
1.如果不global,函数本身就无法运行.

...有什么解决这个冲突的办法吗?

这个函数逻辑有问题
 1. $countsort_sql = "SELECT * FROM `{$db_table}newssort` WHERE `newssort_pid` = '$pid'";
这个的字段newssort_pid,如果第一次$pid可以查询出结果,那么下边
 

复制代码 代码示例:
 while($countsort_row = mysql_fetch_assoc($countsort_result)){
 
   countSort($countsort_row['newssort_pid']);
}
 

这里的参数$countsort_row['newssort_pid']就是你第一次输入$pid,那么如果按照正常思路就永远循环 所以,我认为这里的countSort($countsort_row['newssort_pid']);中$countsort_row['newssort_pid']应该加以变化,比如+1

2.递归的判断条件if($countsort_number > 0)
这个$countsort_number 如果有一次查询结果那么它永远是>0,这是不对的。

修改函数如下,希望对你有所帮助。 
 

复制代码 代码示例:

function countSort($pid)
{
  global $countsort_number;
  $countsort_sql = "SELECT * FROM `{$db_table}newssort` WHERE `newssort_pid` = '$pid'";
  $countsort_result = mysql_query($countsort_sql) or die('数据库查询失败,请与管理员联系!');
  $num=mysql_num_rows($countsort_result);
  $countsort_number +=$num;
 
  if( $num > 0)
  {
   while($countsort_row = mysql_fetch_assoc($countsort_result)){
 
   countSort(++$countsort_row['newssort_pid']);
  }
   mysql_free_result($countsort_result);
  }
  else
    $abc= $countsort_number;

}

补充回答:那是因为你的函数中定义了全局变量,每次循环后,全局变量已经改变了。
修改成:
 

复制代码 代码示例:
function countSort($pid)
{
 
  $countsort_sql = "SELECT * FROM `{$db_table}newssort` WHERE `newssort_pid` = '$pid'";
  $countsort_result = mysql_query($countsort_sql) or die('数据库查询失败,请与管理员联系!');
  $num = mysql_num_rows($countsort_result);
  $countsort_number += $num;
//这里的 $countsort_number是全局的话,下次循环后他会等于
//$countsort_number+countSort($pid),所以没循环一次都会变
  if($num > 0)
  {
    while($countsort_row = mysql_fetch_assoc($countsort_result))
    {
     return countSort($countsort_row['newssort_id']);
    }
  }
else
  return $countsort_number;
}
 

对,这样的确return了 0
我再研究研究这个递归吧。先试试下边这种方式
 

复制代码 代码示例:
$countsort_number=0;
//$countsort_number +=$count_num;
while($inser_nums < 4)
{
 $inser_nums++;
 echo '<hr>'.$inser_nums.'||';
 countSort(2);
 echo '</br>'.$countsort_number/$inser_nums;
//这里的取了个巧,因为每次循环后countSort都会自增一次,所以这样处理一下。
 }
function countSort($pid)
{
  global $countsort_number;
  $countsort_sql = "SELECT * FROM `{$db_table}newssort` WHERE `newssort_pid` = '$pid'";
  $countsort_result = mysql_query($countsort_sql) or die('数据库查询失败,请与管理员联系!');
  $num = mysql_num_rows($countsort_result);
  $countsort_number += $num;
//这里的 $countsort_number是全局的话,下次循环后他会等于
//$countsort_number+countSort($pid),所以没循环一次都会变
  if($num > 0)
  {
    while($countsort_row = mysql_fetch_assoc($countsort_result))
    {
    countSort($countsort_row['newssort_id']);
    }
  }
else
  return 0;
}

三、php递归函数无返回值问题

php递归时没有进行return返回

例子,category为分类表,catid为主角,pid,为父键,level为层次,方法的作用就是根据分类catid,查找它最父级的catid
 

复制代码 代码示例:

<?php
function get_cat_id($catid){
$sql = "select catid,pid,level from modoer_category where catid=$catid";
$query = mysql_query($sql);
$row = mysql_fetch_array($query);

if($row['pid'] == '0'){//当查到一级分类时
return $row['catid'];
}else{//当没有查到时,进行递归
                //这里没写return的时候,就一直没返回值
return get_cat_id($row['pid']);
}
}
?>