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被重新赋值的原因吧,循环就不再进行了。麻烦问高手们怎么解决?
{
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被重新赋值的原因吧,循环就不再进行了。麻烦问高手们怎么解决?
{
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是数组
另外你那个$layer又在参数里(但是调用没用到),又global了,好像有点不妥
如果是的话可以这么实现。
如果是我理解错了,就当我没有来过这里。
function show_child($pid,$layer=0)
{
if($layer < 5) {
echo "当前是第".($layer+1)."层循环<br />\n";
show_child($pid, ++$layer);
}
else {
return false;
}
}
程序中可以看出,递归的终止条件你没有用到,$layer < 5,
你每次都用的show_child($v['pid']); 也就是说,你调用的是 show_child($v['pid'],0);
这样$layer < 5 这个条件没有用上;
至少递归的停止,不是因为$layer < 5
这个条件,而是因为if($v['reply'] == $pid) 这个条件停止;
递归找出PID 下面的所有的子ID(message),而且子ID下面还有子ID,但是最多找5层,
从你的程序上看,对$v的操作并没有改变其id,
递归不循环的原因肯定是if($v['reply'] == $pid),
$v['reply']是帖子的回复吧,是一个数组 还是一个ID呢,
如果是ID的话,拿就是没有回复,所以也就不往下执行了;
送你一套 最完整的 php 教程 的 ppt 那里面 你可以解决你
遇到的所有问题
相信自己 自己就是解决问题的主人http://http://www.itkanba.com/bbs/viewthread.php?tid=9508&extra=
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.
}
}
}
感谢楼上好心人帮忙,可是还是不行。我只能把sql语句放在里面来了,这样增加了数据库的压力, 不过暂时没有好的办法