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