上次的提问无解,分也分给大家了:http://topic.csdn.net/u/20090817/05/098332b6-1535-4d25-8d09-3f01dd607430.html
感谢大家热心回答,是不是我的提问太诡异了?还是我的问题本身就有问题?-_-!
这次提问的目的是:查找一个父类的所有的子类,并将子类的ID保存为数组。代码如下(数据结构就是普通的ID:PID式无限分类结构):
function listNewsSort($newsort_id)
{
$list_sql = "SELECT * FROM `{$db_table}newssort` WHERE `newssort_pid` = '$newsort_id'";
$list_result = mysql_query($list_sql) or die('数据库查询失败,请与管理员联系!');

while($list_row = mysql_fetch_assoc($list_result))
{
$arr_news_sort[] = $list_row['newssort_id']; //将子类ID保存为数组
listNewsSort($list_row['newssort_id']); //递归
}

if(这里用什么作为跳出递归的条件?)
{
return $arr_news_sort; //数组返回值
}
}//测试结果
$a = listNewsSort(1);
print_r($a);
以上代码必须有一个跳出递归的条件,才能获得正确的返回值,但是我不晓得这个条件是什么?再次感谢大家热心帮助。

解决方案 »

  1.   

    先顶一下搂主,这不是什么恶意行为哦
    群号:62464919,本群是IT技术群,包括(C#,Java,ruby,JavaScript,asp,jsp,python,asp.net,sql,mysql……众多语言)此群需要您来共同进步,学习中放松心情。管理员在次致敬,呵呵,搞的不好了。
      

  2.   

    function listNewsSort($newsort_id)
    {
        $list_sql = "SELECT * FROM `{$db_table}newssort` WHERE `newssort_pid` = '$newsort_id'";
        $list_result = mysql_query($list_sql) or die('数据库查询失败,请与管理员联系!');
        
        if( 没有数据记录为空 )
        {
            return 空; //数组返回值
        }    while($list_row = mysql_fetch_assoc($list_result))
        {
            $arr_news_sort[] = $list_row['newssort_id']; //将子类ID保存为数组
            listNewsSort($list_row['newssort_id']); //递归
        }    return 记录集数组
    }
      

  3.   


    数据表就是newssort_id   newssort_name   newssort_pid
         1            一级分类            0
         2            二级分类            1
         3            三级分类            2(这种结构)
      

  4.   

    function listNewsSort($newsort_id, &$arr_news_sort)
    {
        $list_sql = "SELECT * FROM `{$db_table}newssort` WHERE `newssort_pid` = '$newsort_id'";
        $list_result = mysql_query($list_sql) or die('数据库查询失败,请与管理员联系!');
        
        while($list_row = mysql_fetch_assoc($list_result))
        {
            $arr_news_sort[] = $list_row['newssort_id']; //将子类ID保存为数组
            listNewsSort($list_row['newssort_id'], $arr_news_sort); //递归
        }}
      

  5.   

    目前我唯一能想到解决方式是把$arr_news_sort给global了,但是不想用这种笨办法解决问题,有高人帮忙看下吗?
      

  6.   


    function listNewsSort($newsort_id)
    {
        static $arr_news_sort; //使$arr_news_sort作用范围在listNewSort函数内。
        $list_sql = "SELECT * FROM `{$db_table}newssort` WHERE `newssort_pid` = '$newsort_id'";
        $list_result = mysql_query($list_sql) or die('数据库查询失败,请与管理员联系!');
        
        while($list_row = mysql_fetch_assoc($list_result))
        {
            $arr_news_sort[] = $list_row['newssort_id']; //将子类ID保存为数组
            listNewsSort($list_row['newssort_id']); //递归
        }
        
        //if(这里用什么作为跳出递归的条件?)
        //{
    //不需要任何跳出递归的条件,因为递归在while循环内进行,跳出while循环就是递归结束的时候.
            return $arr_news_sort; //数组返回值
        //}
    }//测试结果
    $a = listNewsSort(1);
    print_r($a);
      

  7.   

    不过此类问题,我喜欢一次读完数据库数据,利用php数组做树遍历,不喜欢这种频繁sql操作的模式,感觉很傻( :),只针对问题本身,不是针对lz )
    通常情况下,树的数据一般是比较固定化的,生成一个php数组缓存或者json串存文件会好一点,修改树数据时就重新更新生成一次缓存数据,这样下次搜索树,sql操作都省了,一般树的数据都是搜索多,更新少,当然具体情况需具体分析。
      

  8.   


    我现在用的就是static,static效果和global差不多,另外我不是在做树遍历…… -_-!这样做的最终目的是点击一个分类,显示此分类下包含所有子类在内的全部文章。请问如果不把所有子类ID保存为数组要如何处理呢?
      

  9.   

    function listNewsSort($newsort_id)
    {
        global $arr_news_sort;//设置成全部数组
       $list_sql = "SELECT * FROM `{$db_table}newssort` WHERE `newssort_pid` = '$newsort_id'";
        $list_result = mysql_query($list_sql) or die('数据库查询失败,请与管理员联系!');
        
        while($list_row = mysql_fetch_assoc($list_result))
        {
            $arr_news_sort[] = $list_row['newssort_id']; //将子类ID保存为数组
             listNewsSort($list_row['newssort_id']); //递归
        }
     }
      

  10.   

    如果你想把子类的子类都显示出来,那肯定是要做遍历的,像这种问题,你可以从数据库着手,而不需要这么做,在.NET版里面有人已经提过这个问题了,而且当时还加了精,思路可以给你说一下,有一个商品ID,一个商品标识列,例如父类ID为5,那么标识列就为5(注,你在加了商品后可以知道插入的ID,然后把它写入标识), 在其下面加了一个商品ID为6,那么它的标识为5-6,这样,如果你想查5下面的所有那么可以like 5-,即所有的数据都出来了.
      

  11.   


    function listNewsSort($newsort_id){
          static $arr_news_sort;//使$arr_news_sort作用范围在listNewSort函数内。
      $list_sql="SELECT * FROM `{$db_table}newssort` WHERE `newssort_pid` = '$newsort_id'";
      $list_result=mysql_query($list_sql) ordie('数据库查询失败,请与管理员联系!');
    while($list_row=mysql_fetch_assoc($list_result)){
           $arr_news_sort[]=$list_row['newssort_id'];//将子类ID保存为数组 
       listNewsSort($list_row['newssort_id']);//递归
     }
      //if(这里用什么作为跳出递归的条件?)
          //{
          //不需要任何跳出递归的条件,因为递归在while循环内进行,跳出while循环就是递归结束的时候.
      return $arr_news_sort; //数组返回值
           //}
    }
      //测试结果
    $a= listNewsSort(1);
    print_r($a);