无限级分类是开发中常见的情况,因此本文对常见的无限极分类算法进行总结归纳.
1.循环迭代实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
$arr = [ 1=>[ 'id' =>1, 'name' => '父1' , 'father' =>NULL], 2=>[ 'id' =>2, 'name' => '父2' , 'father' =>NULL], 3=>[ 'id' =>3, 'name' => '父3' , 'father' =>NULL], 4=>[ 'id' =>4, 'name' => '儿1-1' , 'father' =>1], 5=>[ 'id' =>5, 'name' => '儿1-2' , 'father' =>1], 6=>[ 'id' =>6, 'name' => '儿1-3' , 'father' =>1], 7=>[ 'id' =>7, 'name' => '儿2-1' , 'father' =>2], 8=>[ 'id' =>8, 'name' => '儿2-1' , 'father' =>2], 9=>[ 'id' =>9, 'name' => '儿3-1' , 'father' =>3], 10=>[ 'id' =>10, 'name' => '儿3-1-1' , 'father' =>9], 11=>[ 'id' =>11, 'name' => '儿1-1-1' , 'father' =>4], 12=>[ 'id' =>12, 'name' => '儿2-1-1' , 'father' =>7], ]; function generateTree( $items ){ $tree = array (); foreach ( $items as $item ){ if (isset( $items [ $item [ 'father' ]])){ $items [ $item [ 'father' ]][ 'son' ][] = & $items [ $item [ 'id' ]]; } else { $tree [] = & $items [ $item [ 'id' ]]; } } return $tree ; } $tree = generateTree( $arr ); print_r(json_encode( $tree )); |
输出:
分析:
这个算法利用了循环迭代,将线性结构按照父子关系以树形结构输出,算法的关键在于使用了引用.
优点:速度快,效率高.
缺点:数组的key值必须与id值相同,不便于取出数据(同样使用迭代获取数据)
2.递归实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
$arr = [ 0=>[ 'id' =>1, 'name' => '父1' , 'father' =>0], 1=>[ 'id' =>2, 'name' => '父2' , 'father' =>0], 2=>[ 'id' =>3, 'name' => '父3' , 'father' =>0], 3=>[ 'id' =>4, 'name' => '儿1-1' , 'father' =>1], 4=>[ 'id' =>5, 'name' => '儿1-2' , 'father' =>1], 5=>[ 'id' =>6, 'name' => '儿1-3' , 'father' =>1], 6=>[ 'id' =>7, 'name' => '儿2-1' , 'father' =>2], 7=>[ 'id' =>8, 'name' => '儿2-1' , 'father' =>2], 8=>[ 'id' =>9, 'name' => '儿3-1' , 'father' =>3], 9=>[ 'id' =>10, 'name' => '儿3-1-1' , 'father' =>9], 10=>[ 'id' =>11, 'name' => '儿1-1-1' , 'father' =>4], 11=>[ 'id' =>12, 'name' => '儿2-1-1' , 'father' =>7], ]; function generateTree( $arr , $id , $step ){ static $tree =[]; foreach ( $arr as $key => $val ) { if ( $val [ 'father' ] == $id ) { $flg = str_repeat ( '└―' , $step ); $val [ 'name' ] = $flg . $val [ 'name' ]; $tree [] = $val ; generateTree( $arr , $val [ 'id' ] , $step +1); } } return $tree ; } $tree = generateTree( $arr ,0,0); foreach ( $tree as $val ){ echo $val [ 'name' ]. '<br>' ; } |
输出:
分析:
利用了递归,数组的key值与id值可以不相同,最后以顺序的结构输出数组
优点:方便遍历,查找父子元素
缺点:php不擅长递归,数据量大的情况下效率会显著降低
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/dpdp/p/7443889.html