mysql 3层树状结构_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比较合理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值