php 无限级分类:递归和引用 评论回复

数据库:
php 无限级分类:递归和引用 评论回复_第1张图片
递归:

function getChild($data , $id=0) 
{
	//创建一个保存最后输出结果的数据
	$tree=[]; 
	//循环所有数据找到pid为传入id的数组,也就是找到id的儿子们
	foreach($data as $key =>$value) {
		//找到了儿子
		if($value['pid']==$id) {
			//将数组保存进最后结果
			$tree[$value['id']]=$value;
			//为了减少数据量删掉了自己,因为自己不可能是自己的儿子。。
			unset($data[$key]);
			//将儿子的儿孙数组保存到儿子的child数组里(递归查找)
			$tree[$value['id']]['child']=getChild($data , $value['id']);				
		}
	}
	return $tree;
}


//调用
$rows=从数据库找到的数组;

$arr=getChild($rows);

将结果存入一个空数组并json_encode之后返回给前端,结果如下:
php 无限级分类:递归和引用 评论回复_第2张图片
php 无限级分类:递归和引用 评论回复_第3张图片
php 无限级分类:递归和引用 评论回复_第4张图片
分析:

利用了递归,数组的key值与id值可以不相同,最后以顺序的结构输出数组

优点:方便遍历,查找父子元素

缺点:php不擅长递归,数据量大的情况下效率会显著降低

引用:
这里是模仿新浪微博的评论回复区,一条评论下面全是回复的形式,也就是说不是无限级的,只有2级

function getChild($data) 
{
		$tree=[];//返还的最终数组
    	$newdata=[];//

    	foreach ($data as $datanum) {
    		//先将所有的评论回复的id取出来作为索引也就是新数组newdata的下标
    		$newdata[$datanum['id']]=$datanum;
    	}

		//循环新数组newdata
    	foreach ($newdata as $key => $value) {
    		if($value['root_id']!=0) {
    			//如果root_id大于0,代表是回复,将地址给到root_id的索引的child数组下(就给到这条回复的母评论下)
    			$newdata[$value['root_id']]['child'][]=&$newdata[$key];
    		} else {
    			//为评论,将其按照id存入结果树种
    			$tree[]=&$newdata[$key];
    		}
    	}

    	return $tree;
}


//调用
$rows=从数据库找到的数组;

$arr=getChild($rows);

结果如下(我多添加了些字段,但重要的就id和root_id)
php 无限级分类:递归和引用 评论回复_第5张图片

你可能感兴趣的:(PHP,php,无限级分类)