不用递归实现无限级分类,简单测试了下性能比递归稍好一点点点,但写得太复杂了,还是递归简单方便点
代码:
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
31
32
33
34
35
36
37
38
39
40
41
|
<?php
$list = array (
array ( 'id' =>1, 'pid' =>0, 'deep' =>0, 'name' => 'test1' ),
array ( 'id' =>2, 'pid' =>1, 'deep' =>1, 'name' => 'test2' ),
array ( 'id' =>3, 'pid' =>0, 'deep' =>0, 'name' => 'test3' ),
array ( 'id' =>4, 'pid' =>2, 'deep' =>2, 'name' => 'test4' ),
array ( 'id' =>5, 'pid' =>2, 'deep' =>2, 'name' => 'test5' ),
array ( 'id' =>6, 'pid' =>0, 'deep' =>0, 'name' => 'test6' ),
array ( 'id' =>7, 'pid' =>2, 'deep' =>2, 'name' => 'test7' ),
array ( 'id' =>8, 'pid' =>5, 'deep' =>3, 'name' => 'test8' ),
array ( 'id' =>9, 'pid' =>3, 'deep' =>2, 'name' => 'test9' ),
);
function resolve( $list ) {
$newList = $manages = $deeps = $inDeeps = array ();
foreach ( $list as $row ) {
$newList [ $row [ 'id' ]] = $row ;
}
$list = null;
foreach ( $newList as $row ) {
if (! isset( $manages [ $row [ 'pid' ]]) || ! isset( $manages [ $row [ 'pid' ]][ 'children' ][ $row [ 'id' ]])) {
if ( $row [ 'pid' ] > 0 && ! isset( $manages [ $row [ 'pid' ]][ 'children' ])) $manages [ $row [ 'pid' ]] = $newList [ $row [ 'pid' ]];
$manages [ $row [ 'pid' ]][ 'children' ][ $row [ 'id' ]] = $row ;
}
if (! isset( $inDeeps [ $row [ 'deep' ]]) || ! in_array( $row [ 'id' ], $inDeeps [ $row [ 'deep' ]])) {
$inDeeps [ $row [ 'deep' ]][] = array ( $row [ 'pid' ], $row [ 'id' ]);
}
}
krsort( $inDeeps );
array_shift ( $inDeeps );
foreach ( $inDeeps as $deep => $ids ) {
foreach ( $ids as $m ) {
// 存在子栏目的进行转移
if (isset( $manages [ $m [1]])) {
$manages [ $m [0]][ 'children' ][ $m [1]] = $manages [ $m [1]];
$manages [ $m [1]] = null;
unset( $manages [ $m [1]]);
}
}
}
return $manages [0][ 'children' ];
}
|
递归实现
1
2
3
4
5
6
7
8
9
10
11
|
function resolve2(& $list , $pid = 0) {
$manages = array ();
foreach ( $list as $row ) {
if ( $row [ 'pid' ] == $pid ) {
$manages [ $row [ 'id' ]] = $row ;
$children = resolve2( $list , $row [ 'id' ]);
$children && $manages [ $row [ 'id' ]][ 'children' ] = $children ;
}
}
return $manages ;
}
|
以上这篇PHP不使用递归的无限级分类简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。