无限级分类,不用循环方式,数据库必须维护path逗号分隔

本文介绍了一种处理树状结构数据的方法,包括生成树结构数据、维护路径信息及进行节点操作等。通过具体实现展示了如何高效地进行树形结构的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//获取树结构数据 

	//生成数据
	public function tree($type = 1){	
		/*function _function_private_remove_arr_key($data){
			foreach($data as &$v){
				if(isset($v['child'])){
					$v['child'] = _function_private_remove_arr_key(array_values($v['child']));
				}
			}
			unset($v);
			return $data;
		}*/
		$data = array('parent' => array());
		$list = $this->_getlist('categorys', '*', "type=$type", "length(path)-length(replace(path,',','')) asc,length(path) asc,orderby asc,id asc");
		foreach($list as $v){
			if(!$v['pid']){
				$v['path'] = $v['id'];
				$v['thumb'] = concaturl($v['thumb']);
				$data['parent'][$v['id']] = $v;
			}else{
				$paths = explode(',', $v['path']);
				$data_var = '$data[\'parent\']['.$paths[0].'][\'child\']';
				for($i = 1; $i < count($paths); $i ++){
					$data_var .= '['.$paths[$i].'][\'child\']';
				}
				$v['path'] .= ','.$v['id'];
				$v['thumb'] = concaturl($v['thumb']);
				$data_var .= '['.$v['id'].']=$v;';
				eval($data_var);
			}
		}
		//$data['parent'] = _function_private_remove_arr_key(array_values($data['parent']));			
		return $data;
	}

 

 

 

//path路径维护函数

	//删除或独立调整下线层级树
	public function fixpath($ids, $type = 1){
		if(!is_array($ids))$ids = explode(',', $ids);
		foreach($ids as $k => $v){
			if(empty($v))continue;
			$childs = $this->_getlist('categorys', 'id,path', "type=".$type." and FIND_IN_SET('".$v."', path)>0");
			if(!empty($childs)){
				foreach($childs as $vv){
					if($vv['id'] == $v)continue;//排除自己
					$path = trim(str_replace(','.$v.',', '', ','.$vv['path'].','), ',');
					$paths = explode(',', $path);
					$toppid = intval(current($paths));
					$pid = intval(end($paths));
					$this->db->update('categorys', array('pid' => $pid, 'toppid' => $toppid, 'path' => $path), "id=".$vv['id']);
				}
			}
		}
	}
	
	//删除所有下级
	public function delpath($ids, $type = 1){
		if(!is_array($ids))$ids = explode(',', $ids);
		foreach($ids as $k => $v){
			if(empty($v))continue;
			$this->db->delete('categorys', "type=".$type." and FIND_IN_SET('".$v."', path)>0");			
		}
	}
	
	//调整上级时调整所有下级树
	public function fixchild($ids, $type = 1){
		if(!is_array($ids))$ids = explode(',', $ids);
		foreach($ids as $k => $v){
			if(empty($v))continue;
			$childs = $this->_getcols('categorys', 'id,path', "type=".$type." and (id=".$v." or FIND_IN_SET('".$v."', path)>0)");
			if(!empty($childs)){
				$myrow = $childs[$v];
				foreach($childs as $vv){
					if($vv['id'] == $v)continue;//排除自己
					$path = trim(preg_replace('/.*?(,'.$v.',.*?)/', $myrow['path'].'$1', ','.$vv['path'].','), ',');
					$paths = explode(',', $path);
					$toppid = intval(current($paths));
					$pid = intval(end($paths));
					$this->db->update('categorys', array('pid' => $pid, 'toppid' => $toppid, 'path' => $path), "id=".$vv['id']);
				}
			}
		}
	}
	
	//添加/修改获取层级数据
	public function newpath($id, $pid, $type = 1){
		$data = array();
		$data['pid'] = $pid;
		$data['toppid'] = $pid;
		$data['path'] = $pid ? $pid : '';		
		if($pid){			
			$parent = $this->_getrow('categorys', 'id,toppid,path', $id ? "id<>$id and toppid<>$id and pid<>$id and FIND_IN_SET($id, path)=0 and id=$pid" : "id=$pid");
			if($parent){
				$data['toppid'] = $parent['toppid'] ? : $parent['id'];			
				$data['path'] = trim($parent['path'].','.$pid, ',');
			}else{
				$data['pid'] = 0;
				$data['toppid'] = 0;
				$data['path'] = '';					
			}
		}
		return $data;	
	}

	//获取path标题
	public function pathstr($id, $separator = ',', $all = true){
		$row = $this->db->get_row($this->table, '*', $this->keyField."=".$id);
		$str = '';
		if(!$row['path']){
			$str = $all ? '<b>'.$row[$this->showField].'</b>' : '';
		}else{
			$str = $this->db->get_field($this->table, "group_concat(".$this->showField." order by field(".$this->keyField.",".$row['path'].") asc Separator '".$separator."')", "FIND_IN_SET(".$this->keyField.", '".$row['path']."')>0");
			if($all)$str .= $separator.'<b>'.$row[$this->showField].'</b>';
		}
		return $str;		
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值