MySql 树状结构 PHP 重组多维数组
阅读 (2512) 2017-12-15 19:11:54
mysql 中每个用户 以 p_user_id 标记上级用户,root根用户为0,如果 mysql 遍历全部用户层级关系,非常耗时,这里给出一个一次性mysql查询,再PHP处理数据,将二维数组转树状结构数组
// mysql查询结果集类似于这样的二维数组, p_user_id 标记为上级用户ID, 无限级
array: [▼
0 => array:3 [▼
"id" => "0"
"name" => "小赵"
"p_user_id" => ""
]
1 => array:3 [▼
"id" => "100"
"name" => "小钱"
"p_user_id" => "0"
]
2 => array:3 [▼
"id" => "1000"
"name" => "小孙"
"p_user_id" => "100"
]
3 => array:3 [▼
"id" => "10000"
"name" => "小李"
"p_user_id" => "1000"
]
……
]
// 将ID作为key,重组数组
$users = array_column($res,null,'id');
$result = [];
// 找出每个用户的下级
foreach($users as $id => $item)
{
$result[$item['p_user_id']][] = $item;
}
// 遍历成树状结构数组
$tree = $this->createTree($result, [$users[0]]);
// 如果需要用到类似于echart中树状结构图表,则移除不需要的key
$data = $this->removeKeys($tree);
// 最终echart中需要的json数组
$treeJson = json_encode($data);
/**
* 二维数组转树状结构数组
*/
public function createTree(&$list, $parent){
$tree = array();
foreach ($parent as $k=>$l){
if(isset($list[$l['id']])){
$l['children'] = $this->createTree($list, $list[$l['id']]);
}
$tree[] = $l;
}
return $tree;
}
/**
* 移除不需要的key
*/
public function removeKeys(&$arr)
{
foreach($arr as $key => &$item)
{
if(is_array($item))
{
unset($item['id']);
unset($item['p_user_id']);
if(isset($item['children']))
{
$this->removeKeys($item['children']);
}
}
}
return $arr;
}
本例中,万级用户关系,mysql一次找出所有用户字段,再PHP遍历,再移除多余字段,总耗时也就是1秒左右,不过echart展示这么大的结构太慢了,瓶颈在前台渲染上面。
如果针对指定用户异步查询上下级,则还是用ajax异步直接查询mysql比较合理。
更新于:2017-12-15 19:11:54