无限级分类是开发中常见的情况,因此本文对常见的无限极分类算法进行总结归纳.
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