php评论回复无限极嵌套如何实现?已写基本代码,期待高手解惑

PioneerProgram 2015-06-30 04:36:41
下面是有3层嵌套的评论,parent=0表示一级评论,parent=3表示父评论的id为3
$comments = array (
array (
'id' => '3',
'parent' => '0'
),
array (
'id' => '9',
'parent' => '0'
),
array (
'id' => '1',
'parent' => '3'
),
array (
'id' => '2',
'parent' => '3'
),
array (
'id' => '5',
'parent' => '1'
)
,
array (
'id' => '7',
'parent' => '1'
)
);

最笨的办法,实现我要的效果
$sub = array ();
foreach ($comments as $a) {
if ($a['parent'] == 0) {
foreach ($comments as $b) {
if ($b['parent'] == $a['id']) {
foreach ($comments as $c) {
if ($c['parent'] == $b['id']) {
$b['children'][] = $c;
}
}
$a['children'][] = $b;
}
}
$sub[] = $a;
}
}
echo '<pre>';
print_r($sub);

打印出来的就是我要的效果,子评论作为父评论的子数组,但像我这么写没法嵌套多层评论,无限极嵌套要这么实现呢?
请求帮助,感激不尽!
...全文
565 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2015-07-01
  • 打赏
  • 举报
回复
你到精华区去看,递归的,非递归的,各种版本都有
PioneerProgram 2015-07-01
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
我只是向你介绍前人的经验教训 至于代码该怎么写,你得先了解这个东西什么 http://www.haosou.com/s?q=%E9%A2%84%E6%8E%92%E5%BA%8F&src=360chrome_zoned
相关知识了解了下,预排序虽然效率上高很多,但需要修改我现有的数据库结构。 不修改数据库结构,我原有代码该怎么修改,能够达到我要的效果呢
xuzuning 2015-07-01
  • 打赏
  • 举报
回复
我只是向你介绍前人的经验教训 至于代码该怎么写,你得先了解这个东西什么 http://www.haosou.com/s?q=%E9%A2%84%E6%8E%92%E5%BA%8F&src=360chrome_zoned
PioneerProgram 2015-07-01
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
你使用的是邻接列表算法的数据结构 该算法需要用递归来遍历数据,不适合用于较大的嵌套数据体中 虽然有非递归算法,但由于需要在读取全部数据后方能计算。所以也不适合评论回复这种可能出现分页的应用中 对于评论回复这类应用,宜采用预排序(亦称左右值、改型前序遍历)算法的数据结构 正所谓:工欲善其事,先必利其器
听着很有道理,但代码该怎么写呢,能否给个示例
PioneerProgram 2015-07-01
  • 打赏
  • 举报
回复
精华区里果然有我想要的 http://bbs.csdn.net/topics/370094009
qeezer 2015-07-01
  • 打赏
  • 举报
回复
递归就行了~
xuzuning 2015-06-30
  • 打赏
  • 举报
回复
你使用的是邻接列表算法的数据结构 该算法需要用递归来遍历数据,不适合用于较大的嵌套数据体中 虽然有非递归算法,但由于需要在读取全部数据后方能计算。所以也不适合评论回复这种可能出现分页的应用中 对于评论回复这类应用,宜采用预排序(亦称左右值、改型前序遍历)算法的数据结构 正所谓:工欲善其事,先必利其器
程序员小飞 2015-06-30
  • 打赏
  • 举报
回复
跟无限级分类应该是一样的,数据表中存放父级评论ID和当前评论层级,调取的时候运用递归调取就可以拉
  • 打赏
  • 举报
回复
// 无限级分类
	$list = array(
        array('id'=>1, 'fid'=>0, 'title' => '中国'), 
        array('id'=>2, 'fid'=>1, 'title' => '江苏'),
        array('id'=>3, 'fid'=>1, 'title' => '安徽'),
        array('id'=>4, 'fid'=>8, 'title' => '江阴'),
        array('id'=>5, 'fid'=>3, 'title' => '芜湖'),
        array('id'=>6, 'fid'=>3, 'title' => '合肥'),
        array('id'=>7, 'fid'=>3, 'title' => '蚌埠'),
    );

	$new = array();
	foreach($list as $v){
		$new[$v['fid']][] = $v;
	}

	$i = 0;
	$j = 0;
	$a = true;
	$p[$i] = 0;
	$q[$j] = $i;
	while($a){
		$next = false;
		$i = $q[$j];
		$var = $new[$i];
		if(!isset($p[$i])){
			$p[$i] = 0;
		}
		if($p[$i] == count($var)){
			echo '</ul>';
		}else{
			for($k=$p[$i]; $k<count($var);$k++){
				if($k == 0)
					echo '<ul>';
				echo '<li>'.$var[$k]['title'];
				$p[$i]++;
				if(isset($new[$var[$k]['id']])){
					$i = $var[$k]['id'];
					$j++;
					$q[$j] = $i;
					$next = true;
					break;
				}
				echo '</li>';
				if($k == count($var)-1){
					echo '</ul>';
				}
			}
		}
		if($next){
			continue;
		}
		$j--;
		if($j < 0){
			break;
		}
	}
	
	exit;
  • 打赏
  • 举报
回复
是不是可以理解为 无限级 分类的问题?

20,398

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧