PHP无限分类(树形类)的解决办法
内容摘要
这篇文章主要为大家详细介绍了PHP无限分类(树形类)的简单示例,具有一定的参考价值,可以用来参考一下。
感兴趣的小伙伴,下面一起跟随php教程的小玲来看看吧!
PHP无限分类,Google
感兴趣的小伙伴,下面一起跟随php教程的小玲来看看吧!
PHP无限分类,Google
文章正文
这篇文章主要为大家详细介绍了PHP无限分类(树形类)的简单示例,具有一定的参考价值,可以用来参考一下。
感兴趣的小伙伴,下面一起跟随php教程的小玲来看看吧!
PHP无限分类,Google一下就能找到很多相关资料,思路比较拉风的,也是用得比较多的就是分类表至少有id,pid,name三个字段,id自增表分类,pid为父分类,name为分类名,这样就构成了一棵树,如下,算是我查询分类表得到的结果集。
代码如下:
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | <code><?php /* php教程 www.512Pic.com */ //模拟PHP无限分类查询结果 return array ( array ( 'id' =>1, 'pid' =>0, 'name' => '主页' ), array ( 'id' =>2, 'pid' =>0, 'name' => '新闻' ), array ( 'id' =>3, 'pid' =>0, 'name' => '媒体' ), array ( 'id' =>4, 'pid' =>0, 'name' => '下载' ), array ( 'id' =>5, 'pid' =>0, 'name' => '关于我们' ), array ( 'id' =>6, 'pid' =>2, 'name' => '天朝新闻' ), array ( 'id' =>7, 'pid' =>2, 'name' => '海外新闻' ), array ( 'id' =>8, 'pid' =>6, 'name' => '州官新闻' ), array ( 'id' =>9, 'pid' =>3, 'name' => '音乐' ), array ( 'id' =>10, 'pid' =>3, 'name' => '电影' ), array ( 'id' =>11, 'pid' =>3, 'name' => '小说' ), array ( 'id' =>12, 'pid' =>9, 'name' => '铃声' ), array ( 'id' =>13, 'pid' =>9, 'name' => '流行音乐' ), array ( 'id' =>14, 'pid' =>9, 'name' => '古典音乐' ), array ( 'id' =>15, 'pid' =>12, 'name' => '热门铃声' ), array ( 'id' =>16, 'pid' =>12, 'name' => '搞笑铃声' ), array ( 'id' =>17, 'pid' =>12, 'name' => 'MP3铃声' ), array ( 'id' =>18, 'pid' =>17, 'name' => '128K' ), array ( 'id' =>19, 'pid' =>8, 'name' => '娱乐新闻' ), array ( 'id' =>20, 'pid' =>11, 'name' => '穿越类' ), array ( 'id' =>21, 'pid' =>11, 'name' => '武侠类' ), ); ?> </code> |
代码如下:
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | <code><?php /* php教程 www.512Pic.com */ /** * Tree 树型类(无限分类) * * @author Kvoid * @copyright http://kvoid.com * @version 1.0 * @access public * @example * $tree= new Tree($result); * $arr=$tree->leaf(0); * $nav=$tree->navi(15); */ class Tree { private $result ; private $tmp ; private $arr ; private $already = array (); /** * 构造函数 * * @param array $result 树型数据表结果集 * @param array $fields 树型数据表字段,array(分类id,父id) * @param integer $root 顶级分类的父id */ public function __construct( $result , $fields = array ( 'id' , 'pid' ), $root = 0) { $this ->result = $result ; $this ->fields = $fields ; $this ->root = $root ; $this ->handler(); } /** * 树型数据表结果集处理 */ private function handler() { foreach ( $this ->result as $node ) { $tmp [ $node [ $this ->fields[1]]][] = $node ; } krsort( $tmp ); for ( $i = count ( $tmp ); $i > 0; $i --) { foreach ( $tmp as $k => $v ) { if (!in_array( $k , $this ->already)) { if (! $this ->tmp) { $this ->tmp = array ( $k , $v ); $this ->already[] = $k ; continue ; } else { foreach ( $v as $key => $value ) { if ( $value [ $this ->fields[0]] == $this ->tmp[0]) { $tmp [ $k ][ $key ][ 'child' ] = $this ->tmp[1]; $this ->tmp = array ( $k , $tmp [ $k ]); } } } } } $this ->tmp = null; } $this ->tmp = $tmp ; } /** * 反向递归 */ private function recur_n( $arr , $id ) { foreach ( $arr as $v ) { if ( $v [ $this ->fields[0]] == $id ) { $this ->arr[] = $v ; if ( $v [ $this ->fields[1]] != $this ->root) $this ->recur_n( $arr , $v [ $this ->fields[1]]); } } } /** * 正向递归 */ private function recur_p( $arr ) { foreach ( $arr as $v ) { $this ->arr[] = $v [ $this ->fields[0]]; if ( $v [ 'child' ]) $this ->recur_p( $v [ 'child' ]); } } /** * 菜单 多维数组 * * @param integer $id 分类id * @return array 返回分支,默认返回整个树 */ public function leaf( $id = null) { $id = ( $id == null) ? $this ->root : $id ; return $this ->tmp[ $id ]; } /** * 导航 一维数组 * * @param integer $id 分类id * @return array 返回单线分类直到顶级分类 */ public function navi( $id ) { $this ->arr = null; $this ->recur_n( $this ->result, $id ); krsort( $this ->arr); return $this ->arr; } /** * 散落 一维数组 * * @param integer $id 分类id * @return array 返回leaf下所有分类id */ public function leafid( $id ) { $this ->arr = null; $this ->arr[] = $id ; $this ->recur_p( $this ->leaf( $id )); return $this ->arr; } } ?> </code> |
代码如下:
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 | <code><!--导航--> <div id= "navigator" > <{ foreach $nav as $n }> <{ if $n @iteration != $n @last}> <{ $n .name}> -> <{ else }> <{ $n .name}> <{/ if }> <{/ foreach }> </div> <!--树形菜单--> <div id= "menu" > <{ function name=menu}> <ul> <{ foreach $data as $entry }> <li> <span><{ $entry .name}></span> <{*注意字段要改成自己的字段哦*}> <{ if isset( $entry .child)}> <{call name=menu data= $entry .child}> <{/ if }> </li> <{/ foreach }> </ul> <{/ function }> <{call name=menu data= $arr }> <{*注意在这里 $arr 才是模板变量*}> </div> </code> |
注:关于PHP无限分类(树形类)的简单示例的内容就先介绍到这里,更多相关文章的可以留意
代码注释