简述php无限极分类,PHP 无限极分类

1.循环迭代实现无限极分类

public function test(){

// 数组下标与id 一致

$depart_list = [

1 => ['id' => 1, 'grp_name' => '技术部', 'pid' => 0],

2 => ['id' => 2, 'grp_name' => '业务中台', 'pid' => 1],

3 => ['id' => 3, 'grp_name' => '业务前台', 'pid' => 1],

4 => ['id' => 4, 'grp_name' => '业务后台', 'pid' => 1],

5 => ['id' => 5, 'grp_name' => '客服组', 'pid' => 2],

6 => ['id' => 6, 'grp_name' => '管理系统组', 'pid' => 2],

7 => ['id' => 7, 'grp_name' => '支付组', 'pid' => 2],

8 => ['id' => 8, 'grp_name' => '用户组', 'pid' => 4],

9 => ['id' => 9, 'grp_name' => '司机组', 'pid' => 4],

10 => ['id' => 10, 'grp_name' => 'ios组', 'pid' => 3],

11 => ['id' => 11, 'grp_name' => 'android组', 'pid' => 3],

];

$depart_data = $this->generateTree($depart_list);

print_r(json_encode($depart_data, JSON_UNESCAPED_UNICODE));

}

function generateTree($items){

$tree = array();

foreach($items as $item){

if(isset($items[$item['pid']])){

$items[$item['pid']]['son'][] = &$items[$item['id']];

}else{

$tree[] = &$items[$item['id']];

}

}

return $tree;

}

输出结果如下:

[

{

"id": 1,

"grp_name": "技术部",

"pid": 0,

"son": [

{

"id": 2,

"grp_name": "业务中台",

"pid": 1,

"son": [

{

"id": 5,

"grp_name": "客服组",

"pid": 2

},

{

"id": 6,

"grp_name": "管理系统组",

"pid": 2

},

{

"id": 7,

"grp_name": "支付组",

"pid": 2

}

]

},

{

"id": 3,

"grp_name": "业务前台",

"pid": 1,

"son": [

{

"id": 10,

"grp_name": "ios组",

"pid": 3

},

{

"id": 11,

"grp_name": "android组",

"pid": 3

}

]

},

{

"id": 4,

"grp_name": "业务后台",

"pid": 1,

"son": [

{

"id": 8,

"grp_name": "用户组",

"pid": 4

},

{

"id": 9,

"grp_name": "司机组",

"pid": 4

}

]

}

]

}

]

分析:

这个算法利用了循环迭代,将线性结构按照父子关系以树形结构输出,算法的关键在于使用了引用.

优点:速度快,效率高.

缺点:数组的key值必须与id值相同,不便于取出数据(同样使用迭代获取数据)

2.递归实现无限极分类:

public function test(){

$depart_list = [

// 数组下标与id 可以不一致

0 => ['id' => 1, 'grp_name' => '技术部', 'pid' => 0],

1 => ['id' => 2, 'grp_name' => '业务中台', 'pid' => 1],

2 => ['id' => 3, 'grp_name' => '业务前台', 'pid' => 1],

3 => ['id' => 4, 'grp_name' => '业务后台', 'pid' => 1],

4 => ['id' => 5, 'grp_name' => '客服组', 'pid' => 2],

5 => ['id' => 6, 'grp_name' => '管理系统组', 'pid' => 2],

6 => ['id' => 7, 'grp_name' => '支付组', 'pid' => 2],

7 => ['id' => 8, 'grp_name' => '用户组', 'pid' => 4],

8 => ['id' => 9, 'grp_name' => '司机组', 'pid' => 4],

9 => ['id' => 10, 'grp_name' => 'ios组', 'pid' => 3],

10 => ['id' => 11, 'grp_name' => 'android组', 'pid' => 3],

];

$depart_data = $this->generateTree($depart_list, 0, 0);

foreach ($depart_data as $val){

echo $val['grp_name'].'
';

}

}

public function generateTree(array $items, $id, $step){

static $tree=[];

foreach($items as $key=>$val) {

if($val['pid'] == $id) {

$flg = str_repeat('―',$step*2);

$val['grp_name'] = $flg.$val['grp_name'];

$tree[] = $val;

$this->generateTree($items , $val['id'] ,$step+1);

}

}

return $tree;

}

输出如下:

1c436927ee1a

BFC397D8-2535-4C62-9708-9BA121941774.png

分析:

利用了递归,数组的key值与id值可以不相同,最后以顺序的结构输出数组

优点:方便遍历,查找父子元素

缺点:php不擅长递归,数据量大的情况下效率会显著降低

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值