MySql 树状结构 PHP 重组多维数组

阅读 (2512)
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
返回顶部