php无限级评论嵌套实现代码
我在设计BB的过程中,也一直在思考是否可以不通过递归来实现无限级分类的结构展现和父子结构查找,因为如果不对这里的算法进行优化后果可能是致命的!试想一下,一篇文章如果评论数为300,按正常的递归算法,至少就得查询数据库301次,而且还是在没有任何嵌套的情况下,如果有过一两级嵌套或者评论数过1000,那数据库不是直接宕掉?
而实际上,PHP强大的数组处理能力已经能帮助我们快速方便的解决这个问题。下图为一个无限级分类的
数据库结构:
IDparentIDnewsIDcommts
108文章ID为8的评论
218对ID为1的评论的回复
328对ID为2的评论的回复
要在前台嵌套式的展现文章编号8的评论,其实我们只用查询一次数据库,即“SELECT*FROMTABLEWHEREnewsID=8”,而把后期的递归工作交给强大的PHP数组来完成。这里可能涉及的问题就是数组的结构关系的重组,即将所有停留在一级分类上的评论全部放到自己的parentID下,形成children项。
下面将BBComment类中这块的代码粘贴出来,希望与大家分享下我的思路,也希望大家能够提出更好更有效率的算法。
方法一
/**
*按ID条件从评论数组中递归查找
*
*/
functiongetCommentsFromAryById($commtAry,$id)
{
if(!is_array($commtAry))returnFALSE;
foreach($commtAryas$key=>$value){
if($value['id']==$id)return$value;
if(isset($value['children'])&&is_array($children))$this->getCommentsFormAryById($value['children'],$id);
}
}
/**
*追加子评论到主评论中,并形成children子项
*
*@paramarray$commtAry原评论数据引用
*@paramint$parentId主评论ID
*@paramarray$childrenAry子评论的值
*/
functionaddChildenToCommentsAry($commtAry,$parentId,$childrenAry)
{
if(!is_array($commtAry))returnFALSE;
foreach($commtAryas$key=>$value){
if($value['id']==$parentId){
$commtAry[$key]['children'][]=$childrenAry;
returnTRUE;
}
if(isset($value['children']))$this->addChildenToCommentsAry($commtAry[$key]['children'],$parentId,$childrenAry);
}
}
$result=$this->BBDM->select($table,$column,$condition,0,1000);
/*开始进行嵌套评论结构重组*/
array_shift($result);
$count=count($result);
$i=0;
while($i<$count){
if('0'!=$result[$i]['parentId']){
$this->addChildenToCommentsAry($result,$result[$i]['parentId'],$result[$i]);
unset($result[$i]);
}
$i++;
}
$result=array_values($result);
/*重组结束*/
实现方法二
核心代码摘自WordPress
'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'
)
);
functionhtml5_comment($comment){
echo'这篇文章就介绍到这了,其实大家多参考一些开源的cms也可以看到很多不错的代码,希望大家以后多多支持毛票票