function show_child($pid,$layer=0)
{
global $db,$reply_arr,$layers,$circle_reply,$fid;
if($layer >= 5)//递归层数
{
return;
}
$layer++;

foreach($reply_arr as $k => $v)
{
if($v['reply'] == $pid)
{
$v['message'] = discuzcode($v['message'], $replya['smileyoff'], $replya['bbcodeoff'], $replya[
'htmlon'] & 1, 1, $forum['allowbbcode'], ($forum['allowimgcode'] && $showimages ? 1 : 0), $forum['allowhtml'], ($forum['jammer'] && $replya['authorid'] != $discuz_uid ? 1 : 0), 0, $replya['authorid'], $forum['allowmediacode'], $replya['pid']);

echo $v['message'].'|'.$v['pid'].'<br>';
show_child($v['pid']);
}
}

}
有这样一个函数,递归调用的,同时里面又有循环,可是递归之后,应该是由于$v被重新赋值的原因吧,循环就不再进行了。麻烦问高手们怎么解决?

解决方案 »

  1.   

    function show_child($pid,$layer=0)
    {
    global $db,$reply_arr,$layers,$circle_reply,$fid;
    if($layer >= 5)//递归层数
    {
    return;
    }
    $layer++;

    foreach($reply_arr as $k => $v)
    {
    if($v['reply'] == $pid)
    {
    echo $v['message'].'|'.$v['pid'].'<br>';
    show_child($v['pid']);
    }
    }

    }
    简单写点这样,$reply_arr是数组
      

  2.   

    试试加一句 reset($reply_arr)在循环前,
    另外你那个$layer又在参数里(但是调用没用到),又global了,好像有点不妥
      

  3.   

    你把 show_child($v['pid']); 拿到if外面试试
      

  4.   

    你的意思是在第五层停止继续进行递归是不是?
    如果是的话可以这么实现。
    如果是我理解错了,就当我没有来过这里。
    function show_child($pid,$layer=0)
    {
    if($layer < 5) {
    echo "当前是第".($layer+1)."层循环<br />\n";
    show_child($pid, ++$layer);
    }
    else {
    return false;
    }
    }
      

  5.   

    LZ把你的业务说明一下,
    程序中可以看出,递归的终止条件你没有用到,$layer < 5,
    你每次都用的show_child($v['pid']);  也就是说,你调用的是 show_child($v['pid'],0);
    这样$layer < 5 这个条件没有用上;
      至少递归的停止,不是因为$layer < 5
      这个条件,而是因为if($v['reply'] == $pid)  这个条件停止;
      

  6.   

    LZ的意思是不是这样的:
     递归找出PID 下面的所有的子ID(message),而且子ID下面还有子ID,但是最多找5层,
     从你的程序上看,对$v的操作并没有改变其id,
     递归不循环的原因肯定是if($v['reply'] == $pid),
       $v['reply']是帖子的回复吧,是一个数组 还是一个ID呢,
       如果是ID的话,拿就是没有回复,所以也就不往下执行了;
      

  7.   

    不要有问题就想到问人家 你就是解决问题的最佳人选啊 
    送你一套 最完整的 php 教程 的 ppt 那里面 你可以解决你 
    遇到的所有问题 
    相信自己 自己就是解决问题的主人http://http://www.itkanba.com/bbs/viewthread.php?tid=9508&extra=
      

  8.   


    function show_child($pid,$layer=0) { 
       global $db,$reply_arr,$layers,$circle_reply,$fid; 
       if($layer >= 5)//递归层数  
       { return; } $layer++;    foreach($reply_arr as $k => $v) { 
           if($v['reply'] == $pid) {
              echo $v['message'].'|'.$v['pid'].'<br>'; 
              show_child($v['pid'], 7); // here, you want to stop this loop , and
                                        // add the second parameter that is more than 5.
           } 
       } 
    }
      

  9.   

    不好意思,才过来看,这几天晕了
    感谢楼上好心人帮忙,可是还是不行。我只能把sql语句放在里面来了,这样增加了数据库的压力, 不过暂时没有好的办法