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比较合理。
|