<?<span php </span><span /*</span><span * * 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); </span><span */</span> <span class</span><span Tree { </span><span private</span> <span $result</span><span ; </span><span private</span> <span $tmp</span><span ; </span><span private</span> <span $arr</span><span ; </span><span private</span> <span $already</span> = <span array</span><span (); </span><span /*</span><span * * 构造函数 * * @param array $result 树型数据表结果集 * @param array $fields 树型数据表字段,array(分类id,父id) * @param integer $root 顶级分类的父id </span><span */</span> <span public</span> <span function</span> __construct(<span $result</span>, <span $fields</span> = <span array</span>('id', 'pid'), <span $root</span> = 0<span ) { </span><span $this</span>->result = <span $result</span><span ; </span><span $this</span>->fields = <span $fields</span><span ; </span><span $this</span>->root = <span $root</span><span ; </span><span $this</span>-><span handler(); } </span><span /*</span><span * * 树型数据表结果集处理 </span><span */</span> <span private</span> <span function</span><span handler() { </span><span foreach</span> (<span $this</span>->result <span as</span> <span $node</span><span ) { </span><span $tmp</span>[<span $node</span>[<span $this</span>->fields[1]]][] = <span $node</span><span ; } </span><span krsort</span>(<span $tmp</span><span ); </span><span for</span> (<span $i</span> = <span count</span>(<span $tmp</span>); <span $i</span> > 0; <span $i</span>--<span ) { </span><span foreach</span> (<span $tmp</span> <span as</span> <span $k</span> => <span $v</span><span ) { </span><span if</span> (!<span in_array</span>(<span $k</span>, <span $this</span>-><span already)) { </span><span if</span> (!<span $this</span>-><span tmp) { </span><span $this</span>->tmp = <span array</span>(<span $k</span>, <span $v</span><span ); </span><span $this</span>->already[] = <span $k</span><span ; </span><span continue</span><span ; } </span><span else</span><span { </span><span foreach</span> (<span $v</span> <span as</span> <span $key</span> => <span $value</span><span ) { </span><span if</span> (<span $value</span>[<span $this</span>->fields[0]] == <span $this</span>->tmp[0<span ]) { </span><span $tmp</span>[<span $k</span>][<span $key</span>]['child'] = <span $this</span>->tmp[1<span ]; </span><span $this</span>->tmp = <span array</span>(<span $k</span>, <span $tmp</span>[<span $k</span><span ]); } } } } } </span><span $this</span>->tmp = <span null</span><span ; } </span><span $this</span>->tmp = <span $tmp</span><span ; } </span><span /*</span><span * * 反向递归 </span><span */</span> <span private</span> <span function</span> recur_n(<span $arr</span>, <span $id</span><span ) { </span><span foreach</span> (<span $arr</span> <span as</span> <span $v</span><span ) { </span><span if</span> (<span $v</span>[<span $this</span>->fields[0]] == <span $id</span><span ) { </span><span $this</span>->arr[] = <span $v</span><span ; </span><span if</span> (<span $v</span>[<span $this</span>->fields[1]] != <span $this</span>->root) <span $this</span>->recur_n(<span $arr</span>, <span $v</span>[<span $this</span>->fields[1<span ]]); } } } </span><span /*</span><span * * 正向递归 </span><span */</span> <span private</span> <span function</span> recur_p(<span $arr</span><span ) { </span><span foreach</span> (<span $arr</span> <span as</span> <span $v</span><span ) { </span><span $this</span>->arr[] = <span $v</span>[<span $this</span>->fields[0<span ]]; </span><span if</span> (<span $v</span>['child']) <span $this</span>->recur_p(<span $v</span>['child'<span ]); } } </span><span /*</span><span * * 菜单 多维数组 * * @param integer $id 分类id * @return array 返回分支,默认返回整个树 </span><span */</span> <span public</span> <span function</span> leaf(<span $id</span> = <span null</span><span ) { </span><span $id</span> = (<span $id</span> == <span null</span>) ? <span $this</span>->root : <span $id</span><span ; </span><span return</span> <span $this</span>->tmp[<span $id</span><span ]; } </span><span /*</span><span * * 导航 一维数组 * * @param integer $id 分类id * @return array 返回单线分类直到顶级分类 </span><span */</span> <span public</span> <span function</span> navi(<span $id</span><span ) { </span><span $this</span>->arr = <span null</span><span ; </span><span $this</span>->recur_n(<span $this</span>->result, <span $id</span><span ); </span><span krsort</span>(<span $this</span>-><span arr); </span><span return</span> <span $this</span>-><span arr; } </span><span /*</span><span * * 散落 一维数组 * * @param integer $id 分类id * @return array 返回leaf下所有分类id </span><span */</span> <span public</span> <span function</span> leafid(<span $id</span><span ) { </span><span $this</span>->arr = <span null</span><span ; </span><span $this</span>->arr[] = <span $id</span><span ; </span><span $this</span>->recur_p(<span $this</span>->leaf(<span $id</span><span )); </span><span return</span> <span $this</span>-><span arr; } } </span>?>