不用递归实现无限级分类,简单测试了下性能比递归稍好一点点点,但写得太复杂了,还是递归简单方便点
代码:
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不使用递归的无限级分类简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。