遇到需要设计树节点的数据库结构,以及需要读出来的树节点数据结构!大家是否会选择用数据库的查询方式来获取树结构呢?
//曾经的数据库查询获取方式
$res = $this->db->query("select * from menu where pid = 0");
foreach($res as $k=>$v){
$res[$k]['child'] = $this->db->query("select * from menu where pid =".$v['id']);
}
//获得结果 $res;
注意:不得不说,这种方式的确可行,但是它的缺点在于,你需要固定多少层级,以及数据库的大量运行查询。
不要忽视了那点数据库的查询消耗哦,数据小还无所谓,但是数据量大了。这种可行的方式,会给系统带来很大的负担!
那么,大家要明白一个道理,有些时候 数据库的操作 利大于 PHP程序算法,有些时候则反之!
在这种基础的树节点情况下,用算法是最佳的。
PHP 代码算法(CI框架实现:并非打广告!哈哈)
public function getMenus(){
//查询
$res = $this->db->get('menu')->result_array();
$res = $this->getChild($res);
print_r($res);
}
/**
* 递归 树节点算法
* @param array $array
* @param number $pid
*/
private function getChild($array,$pid = 0){
$data = array();
foreach ($array as $k=>$v){
//PID符合条件的
if($v['pid'] == $pid){
//寻找子集
$child = $this->getChild($array,$v['id']);
//加入数组
$v['child'] = $child?:array();
$data[] = $v;//加入数组中
}
}
return $data;
}
//这样的好处在于,运算速度快,消耗小,而且不定层级。意味着,数据库写多少层级,该算法,都可以获取出来
结果:
Array
(
[0] => Array
(
[id] => 1
[title] => 华邦直播
[pid] => 0
[sort] => 0
[child] => Array
(
)
)
[1] => Array
(
[id] => 2
[title] => 系统设置
[pid] => 0
[sort] => 99
[child] => Array
(
[0] => Array
(
[id] => 4
[title] => 权限管理
[pid] => 2
[sort] => 2
[child] => Array
(
)
)
[1] => Array
(
[id] => 5
[title] => 菜单栏目
[pid] => 2
[sort] => 0
[child] => Array
(
)
)
[2] => Array
(
[id] => 3
[title] => 管理员
[pid] => 2
[sort] => 99
[child] => Array
(
)
)
)
)
)
作者:PHPRable
链接:https://www.jianshu.com/p/c3f5a1dd9514
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。