今天看到一段处理从数据库拿出菜单数据构建成树结构的代码,忍不住还是修改了下。他们是这么处理的:
php
private function create_node_tree($datas)
{
$menus=[];
if($datas)
{
$child = [];
foreach($datas as $key=>$val)
{
if($val['status'] == 1 and $val['pid'] == 0)
{
$child[$val['id']] = [
/* 属性赋值 */
'children'=>[],
];
}
}
foreach($datas as $key=>$val)
{
if(isset($child[$val['pid']]))
{
$child[$val['pid']]['children'][$val['id']] = [
/* 属性赋值 */
'children'=>[],
];
foreach($datas as $k=>$v)
{
if(isset($child[$val['pid']]['children'][$v['pid']]))
{
$child[$val['pid']]['children'][$v['pid']]['children'][$k] = [
/* 属性赋值 */
'children'=>[],
];
}
}
}
}
$child = $this->dealArray($child);
foreach($child as $key => $cv){
$child[$key]['children'] = $this->dealArray($cv['children']);
foreach($child[$key]['children'] as &$ccv){
$ccv['children'] = $this->dealArray($ccv['children']);
}
}
$menus = $child;
}
return $menus ;
}
怎么说呢,这个处理不能说它错了,毕竟人家跑了好久,都过亿流水了。。。
下面是我做了修改的代码:
php
private function multi_create_node_tree($datas)
{
$menus=[];
if($datas)
{
$map = []
foreach($datas as $key=>$val)
{
if($val['status'] == 1)
{
$map[$val['id']] = [
/* 属性赋值 */
'children'=>[],
];
}
}
foreach($datas as $key=>$val)
{
if($val['pid']==0)
{
$menus[] = &$map[$v['pid']];
}else{
$map[$val['pid']]['children'][] = $map[$val['id']];
}
}
}
return $menus;
}
这么改后的好处:
1.扩展了可以多级菜单设置,不再是写死的三层处理
2.性能提升5倍左右