你给出的示例表与函数中的字段无明确对应关系,望改正!表数据:
id    pid
1      0
3      1
4      3逆向递归--由子向父查找的一般算法是
founction foo($id) (
  $sql = "select pid from tbl_name where id=$id";
  $rs = xxx_query($sql);
  whild(list($pid) = xxx_fetch_row($rs)) {
    return foo($pid);
  }
}

解决方案 »

  1.   

    RESOURCE_SORT_ID ==> id
    RESOURCE_SORT_PID  ==> pid
    我简写了一下老大。。
      

  2.   

    有两个要注意的地方
    1 如果表不大的话,把整个表预读到数组里要比每次递归查数据库合理的多
    2 查找父结点过程中,最好判断可能出现的环
    3 一个结点有多个父结点的情况处理仅就你写的函数来说
    第一个函数可以改为
    function getpid($selfid){
    GLOBAL $db;
    $sql = "select RESOURCE_SORT_PID from RESOURCE_SORT where RESOURCE_SORT_ID=".$selfid;
    $query = $db->query($sql);
    $return = '';
    while($row = $db->fetch_array($query)){
    if($row['RESOURCE_SORT_PID'] > 0){
    $return .= empty($return) ? $row['RESOURCE_SORT_PID'] : ','.$row['RESOURCE_SORT_PID'];
    $return .= empty($return) ? getpid($row['RESOURCE_SORT_PID']) : ','.getpid($row['RESOURCE_SORT_PID']);
    }else{
    return $return;
    }
    }
    return $return;
    }
      

  3.   

    我也有个问题要问
    示例:
    function a(){
       some code
       a()
       other code
    }
    这个函数中,调用递归后other code是怎么个执行情况?
      

  4.   

    低归完全完了后就微执行other code
      

  5.   

    只分析你第一个函数,第二个相似:getpid(4,''),$return初值是'',
    第一次调用getpid()后,$return值为3,
    因为3不空,在递归调用getpid()时将3传给了参数$return,
    查询到pid为1,不空,则$return=3,1
    再判断$return仍不空,再次递归调用getpid(),$return为3,1
    由1查到的pid为0,则返回$return,则第二次调用的$return为3,1,3,1
    再返回到第一次调用,加上前面的3,就成了3,3,1,3,1
      

  6.   

    回shawn_sgp() 兄:
    小弟还是有一些不明白:
    -----查询到pid为1,不空,则$return=3,1//此时pid为1,而1的pid为0
    -----再判断$return仍不空,再次递归调用getpid(),$return为3,1//这时再次调用getpid()时,
    传进的$selfid是不是应该为1?而1的pid为0,到后面的if判断。。
    if($row['RESOURCE_SORT_PID'] > 0){
      .....
    }else{
      return $return;
    }
    是不是应该return了?
    而结果应是:3,3,1----- 我分析的哪里出了问题???
      

  7.   

    调用:
    1->getpid(4,'')
    2->getpid(3,'3')
    3->getpid(1,'3,1')返回是倒过来拼起来的
    3->return '3,1'
    2->return '3,1,3,1'
    1->return '3,3,1,3,1'
      

  8.   

    多谢you_kind(=。=)兄的建议:
    用了你写的函数。输出结果是:3,1,
    当然,,可以用很多种办法把后面的‘,’号过滤掉。。
    如果是那样的话,,我开帖的意义就不大了。。我就是想写出一个不需要再处理多余“,”号的函数。。
      

  9.   

    SortId SortUid SortName
    1 0 A
    3 1 B
    4 1 C
    5 3 D
    6 3 E
    7 4 F
    8 4 G
    9 5 H
    10 5 I
    11 9 J
    12 11 K
    13 12 L
    14 13 M##############################################################################################################################function findsort($id,$rows,$rowk) {
    global $db;
    if(!empty($id)) {
    $sql = "select SortId,SortUid,SortName from InfoSorts where SortId = '$id'";
    $query = $db -> query($sql);
    while($row = $db -> fetch_array($query)) {
    if(empty($rowk)) {
    $rowk = $row['SortId'];
    }else{
    $rowk .= "," . $row['SortId'];
    }
    $rowa = array($row['SortId'],$row['SortUid'],$row['SortName']);
    $rows[] = $rowa;
    return findsort($row['SortUid'],$rows,$rowk);
    }
    }else{
    return array($rows,$rowk);
    }
    }
    $as = findsort(14,null,null);
    echo("<pre>");
    print_r($as[0]);
    echo("</pre>");
    echo("<br><br>");
    echo($as[1]);##############################################################################################################################Array
    (
        [0] => Array
            (
                [0] => 14
                [1] => 13
                [2] => M
            )    [1] => Array
            (
                [0] => 13
                [1] => 12
                [2] => L
            )    [2] => Array
            (
                [0] => 12
                [1] => 11
                [2] => K
            )    [3] => Array
            (
                [0] => 11
                [1] => 9
                [2] => J
            )    [4] => Array
            (
                [0] => 9
                [1] => 5
                [2] => H
            )    [5] => Array
            (
                [0] => 5
                [1] => 3
                [2] => D
            )    [6] => Array
            (
                [0] => 3
                [1] => 1
                [2] => B
            )    [7] => Array
            (
                [0] => 1
                [1] => 0
                [2] => A
            ))14,13,12,11,9,5,3,1
      

  10.   

    唠叨写的那个绝对精辟,最后再返回pid数组即可。
      

  11.   

    刚才做了一些测试发现:
    1->getpid(4,'')     $return = 3
    2->getpid(3,'3')    $return = 3,1
    3->getpid(1,'3,1')  到了第三次调用时:$selfid为1,程序执行了else中的return $return..
    但是奇怪的是return $return不仅仅只是做了一次把$return这个变量return..我知道我问得有点过份了,但是还是希望有人告诉我这是什么?
    以下是我的代码:
    $i = 0;
    function getpid3($selfid,$return){
    GLOBAL $db,$i;
    $i++;
    $sql = "select RESOURCE_SORT_PID from RESOURCE_SORT where RESOURCE_SORT_ID=".$selfid;
    $query = $db->query($sql);
    while($row = $db->fetch_array($query)){
    if($row['RESOURCE_SORT_PID'] > 0){
    if($selfid == 1){
    echo '|||||||||||||||||||||||||||||||||<br>';
    }
    $return .= empty($return) ? $row['RESOURCE_SORT_PID'] : ','.$row['RESOURCE_SORT_PID'];
    echo $i.'=='.$selfid.'=='.$return.'***************************************<Br>';
    $return .= empty($return) ? getpid3($row['RESOURCE_SORT_PID'],$return) : ','.getpid3($row['RESOURCE_SORT_PID'],$return);
    //return getpid3($row['RESOURCE_SORT_PID'],$return);
    echo $i.'=='.$selfid.'=='.$return.'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<br>';
    }else{
    if($selfid == 1){
    echo '-----------------------------------------<br>';
    }
    echo $i.'=='.$selfid.'=='.$return.'#############################################<Br>';
    return $return;
    }
    }
    return $return;
    }
    $tid = getpid3($rid,'');
    var_dump($tid);
    exit;
    以下是输出结果:1==4==3***************************************
    2==3==3,1***************************************
    -----------------------------------------//从这里开始执行else
    3==1==3,1#############################################//输出了一次return的值
    3==3==3,1,3,1@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//这里却执行了if里的语句
    3==4==3,3,1,3,1@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//还有这里。
    string(9) "3,3,1,3,1" '=='最左面是循环的次数,中间是$selfid,最后是$return的值谁能告诉我为什么这样。??????
      

  12.   

    function getpid($paraid){
    打开关闭数据库的代码我省了,得到一个数据库记录ID记为变量$id
    if($id=0){
    echo "最终ID为".$id;
    }else{
    echo "这里是一个父ID".$id.">";
    getpid($id);
    }
    }
    里面输出的地方也可以用变量替换
      

  13.   

    新手,凑个热闹,不知道大家在讨论的是什么,但是我可以通过递归得到正常的序列啊
    连接数据库的部分,请大家自行替换,我的问题是我无法返回,代码如下:
    <?php
    include("OP_DB.php"); $db=new OP_DB(); $db->connect_db('localhost','root','dreambird','test'); function digui($id,$vv)
    { $query="select pid from test where id=".$id; //echo $query;

    $result=mysql_query($query); $row=mysql_fetch_array($result); if($row[pid]!=0)
    {
    $vv.=$id;
    digui($row[pid],$vv);
    } else
    {
    $vv.=$id;
    //echo $vv;在此处可以得到正常的序列
    return $vv;

    }
    } echo digui(4,'');return后,在此处得到的值是空,为什么啊??> 
      

  14.   

    if($row[pid]!=0)
    {
    $vv.=$id;
    return digui($row[pid],$vv);
    }