ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 无限分类 ``` <pre class="calibre18">``` <span class="token1"><</span><span class="token1">?</span>php namespace Org\LAMP<span class="token3">;</span> class <span class="token4">CatTree</span> <span class="token3">{</span> private static $order <span class="token1">=</span> <span class="token2">'ord'</span><span class="token3">;</span> <span class="token">//有排序字段和表的对应,如果没有这个字段可以不写</span> private $id <span class="token1">=</span> <span class="token2">'typeid'</span><span class="token3">;</span> <span class="token">//表的id字段</span> private $pid <span class="token1">=</span> <span class="token2">'pid'</span><span class="token3">;</span> <span class="token">//表的父级pid字段</span> private $typename <span class="token1">=</span> <span class="token2">'name'</span><span class="token3">;</span> <span class="token">//表字段对应的类型名</span> private $son <span class="token1">=</span> <span class="token2">'subcat'</span><span class="token3">;</span> <span class="token">//如果有子数组,子数组下标,可以自定义值(在新数组中出现)</span> private $level <span class="token1">=</span> <span class="token2">'level'</span><span class="token3">;</span> <span class="token">//默认的新加级别下标, 可以自定义值</span> private $path <span class="token1">=</span> <span class="token2">'path'</span><span class="token3">;</span> <span class="token">//默认的路径下标,可以自定义</span> private $ps <span class="token1">=</span> <span class="token2">','</span><span class="token3">;</span> <span class="token">//默认的路径分隔符号,可以自己字义</span> private $childs <span class="token1">=</span> <span class="token2">'childs'</span><span class="token3">;</span> <span class="token">//默认的子数组下标,可以自己定义</span> private $narr <span class="token1">=</span> <span class="token4">array</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//放分完级别后的数组</span> private $i<span class="token3">;</span> <span class="token">//临时的一个记数</span> private $pathname <span class="token1">=</span> <span class="token2">'pathname'</span><span class="token3">;</span> <span class="token">//默认的全路径名,可以自己定义belongs</span> <span class="token">//设置表字段id</span> public <span class="token5">function</span> <span class="token4">setId</span><span class="token3">(</span>$value<span class="token1">=</span><span class="token2">''</span><span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>id<span class="token1">=</span>$value<span class="token3">;</span> <span class="token3">}</span> <span class="token">//表的父级pid字段</span> public <span class="token5">function</span> <span class="token4">setPid</span><span class="token3">(</span>$value<span class="token1">=</span><span class="token2">''</span><span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>pid<span class="token1">=</span>$value<span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">setTypename</span><span class="token3">(</span>$value<span class="token1">=</span><span class="token2">''</span><span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>typename<span class="token1">=</span>$value<span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">setPathname</span><span class="token3">(</span>$value<span class="token1">=</span><span class="token2">''</span><span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>pathname<span class="token1">=</span>$value<span class="token3">;</span> <span class="token3">}</span> <span class="token">/** * * 获取分类数结构 * 第二个参数为true时,补全父类 如:衣服/上衣/ * @param $items array 从数据库查询出来的分类信息(二维数组) * @param $allpath boolean 是否返回全路径类型名称 默认不返回提高效率 * @return 返回多维数组 */</span> public <span class="token5">function</span> <span class="token4">getTree</span><span class="token3">(</span>$items<span class="token3">,</span>$allpath<span class="token1">=</span><span class="token6">false</span><span class="token3">)</span><span class="token3">{</span> <span class="token5">if</span><span class="token3">(</span><span class="token4">empty</span><span class="token3">(</span>$items<span class="token3">)</span><span class="token3">)</span> <span class="token5">return</span> <span class="token4">array</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $tree <span class="token1">=</span> <span class="token4">array</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//格式化的树</span> $tmpMap <span class="token1">=</span> <span class="token4">array</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//临时扁平数据</span> <span class="token">//如果数组中有排序字段则先排序 返回排序后的数组</span> <span class="token5">if</span><span class="token3">(</span><span class="token4">array_key_exists</span><span class="token3">(</span>self<span class="token3">:</span><span class="token3">:</span>$order<span class="token3">,</span> $items<span class="token3">[</span><span class="token6">0</span><span class="token3">]</span><span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span><span class="token">//二维数组中存在排序的字段则进行排序</span> <span class="token4">usort</span><span class="token3">(</span>$items<span class="token3">,</span> <span class="token4">array</span><span class="token3">(</span>__CLASS__<span class="token3">,</span> <span class="token2">"compare"</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span><span class="token">//用户自定义的函数或者方法排序(当前类的compare方法)</span> <span class="token3">}</span> <span class="token">//取出id座位键名将该数据装入$tmpMap(将下标值替换成typeid)</span> foreach <span class="token3">(</span>$items as $item<span class="token3">)</span> <span class="token3">{</span> $tmpMap<span class="token3">[</span>$item<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>id<span class="token3">]</span><span class="token3">]</span> <span class="token1">=</span> $item<span class="token3">;</span> <span class="token3">}</span> <span class="token">//自定义开始:取出带父类别名的类别名</span> <span class="token5">if</span> <span class="token3">(</span>$allpath<span class="token3">)</span> <span class="token3">{</span> foreach <span class="token3">(</span>$tmpMap as $key <span class="token1">=</span><span class="token1">></span>$temp<span class="token3">)</span> <span class="token3">{</span> <span class="token">//如果pid>0即存在父类别</span> <span class="token5">if</span> <span class="token3">(</span>$temp<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>pid <span class="token3">]</span><span class="token3">)</span> <span class="token3">{</span> <span class="token">//拿到path</span> $path<span class="token1">=</span>$temp<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>path<span class="token3">]</span><span class="token3">;</span> $pathArr<span class="token1">=</span><span class="token4">explode</span><span class="token3">(</span>$this<span class="token1">-</span><span class="token1">></span>ps<span class="token3">,</span> $path<span class="token3">)</span><span class="token3">;</span><span class="token">//fuid数组</span> <span class="token">//取出父id数组的名字</span> $aname<span class="token1">=</span><span class="token2">''</span><span class="token3">;</span> foreach <span class="token3">(</span>$pathArr as $pid<span class="token3">)</span> <span class="token3">{</span> <span class="token5">if</span> <span class="token3">(</span>$pid<span class="token1">!=</span><span class="token6">0</span><span class="token3">)</span> <span class="token3">{</span> foreach <span class="token3">(</span>$tmpMap as $value<span class="token3">)</span> <span class="token3">{</span> <span class="token5">if</span> <span class="token3">(</span>$pid<span class="token1">==</span>$value<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>id<span class="token3">]</span><span class="token3">)</span> <span class="token3">{</span> $aname<span class="token3">.</span><span class="token1">=</span>$value<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>typename<span class="token3">]</span><span class="token3">.</span><span class="token2">'/'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token3">}</span><span class="token5">else</span><span class="token3">{</span> <span class="token5">continue</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> $aname<span class="token1">=</span> $aname<span class="token3">.</span>$temp<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>typename<span class="token3">]</span><span class="token3">;</span> <span class="token3">}</span><span class="token5">else</span><span class="token3">{</span> $aname<span class="token1">=</span>$temp<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>typename<span class="token3">]</span><span class="token3">;</span> <span class="token3">}</span> $tmpMap<span class="token3">[</span>$key<span class="token3">]</span><span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>pathname<span class="token3">]</span><span class="token1">=</span>$aname<span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">//自定义结束</span> foreach <span class="token3">(</span>$items as $item<span class="token3">)</span> <span class="token3">{</span> <span class="token5">if</span> <span class="token3">(</span><span class="token4">isset</span><span class="token3">(</span>$tmpMap<span class="token3">[</span>$item<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>pid<span class="token3">]</span><span class="token3">]</span><span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> <span class="token">//循环原数组,原数组中的pid是临时数组的id时,将原数组的这组数据插入到子数组中</span> $tmpMap<span class="token3">[</span>$item<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>pid<span class="token3">]</span><span class="token3">]</span><span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>son<span class="token3">]</span><span class="token3">[</span><span class="token3">]</span> <span class="token1">=</span> <span class="token1">&</span>$tmpMap<span class="token3">[</span>$item<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>id<span class="token3">]</span><span class="token3">]</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">else</span> <span class="token3">{</span> <span class="token">//如果pid=0时</span> $tree<span class="token3">[</span><span class="token3">]</span> <span class="token1">=</span> <span class="token1">&</span>$tmpMap<span class="token3">[</span>$item<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>id<span class="token3">]</span><span class="token3">]</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token5">return</span> $this<span class="token1">-</span><span class="token1">></span><span class="token4">pathchild</span><span class="token3">(</span>$tree<span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">/** * 设置类路路径, 和获取全部子类 * return eg ["childs"] => string(4) "2,3," */</span> private <span class="token5">function</span> <span class="token4">pathchild</span><span class="token3">(</span>$arr<span class="token3">,</span> $path<span class="token1">=</span><span class="token2">''</span><span class="token3">)</span> <span class="token3">{</span> $xarr <span class="token1">=</span> <span class="token4">array</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> foreach <span class="token3">(</span>$arr as $k<span class="token1">=</span><span class="token1">></span>$v<span class="token3">)</span> <span class="token3">{</span> $xarr<span class="token3">[</span>$k<span class="token3">]</span><span class="token1">=</span>$v<span class="token3">;</span> $xarr<span class="token3">[</span>$k<span class="token3">]</span><span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>path<span class="token3">]</span> <span class="token1">=</span> $path<span class="token3">.</span>$this<span class="token1">-</span><span class="token1">></span>ps<span class="token3">.</span>$v<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>pid<span class="token3">]</span><span class="token3">;</span> $xarr<span class="token3">[</span>$k<span class="token3">]</span><span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>childs<span class="token3">]</span> <span class="token1">=</span> <span class="token2">''</span><span class="token3">;</span> <span class="token5">if</span><span class="token3">(</span><span class="token4">isset</span><span class="token3">(</span>$xarr<span class="token3">[</span>$k<span class="token3">]</span><span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>son<span class="token3">]</span><span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> $xarr<span class="token3">[</span>$k<span class="token3">]</span><span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>son<span class="token3">]</span><span class="token1">=</span>$this<span class="token1">-</span><span class="token1">></span><span class="token4">pathchild</span><span class="token3">(</span>$xarr<span class="token3">[</span>$k<span class="token3">]</span><span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>son<span class="token3">]</span><span class="token3">,</span> $xarr<span class="token3">[</span>$k<span class="token3">]</span><span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>path<span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">foreach</span><span class="token3">(</span>$xarr<span class="token3">[</span>$k<span class="token3">]</span><span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>son<span class="token3">]</span> as $vv<span class="token3">)</span> <span class="token3">{</span> $xarr<span class="token3">[</span>$k<span class="token3">]</span><span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>childs<span class="token3">]</span> <span class="token3">.</span><span class="token1">=</span> $vv<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>id<span class="token3">]</span><span class="token3">;</span> $xarr<span class="token3">[</span>$k<span class="token3">]</span><span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>childs<span class="token3">]</span> <span class="token3">.</span><span class="token1">=</span> $this<span class="token1">-</span><span class="token1">></span>ps<span class="token3">.</span>$vv<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>childs<span class="token3">]</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token5">return</span> $xarr<span class="token3">;</span> <span class="token3">}</span> <span class="token">/** * * 返回带有层数级别的二维数组 * @param array $arr 从表中获取的数组 * @return array 处理过的数组 */</span> public <span class="token5">function</span> <span class="token4">getList</span><span class="token3">(</span>$arr<span class="token3">,</span> $allpath<span class="token1">=</span><span class="token6">false</span><span class="token3">)</span> <span class="token3">{</span> $data<span class="token1">=</span>$this<span class="token1">-</span><span class="token1">></span><span class="token4">getTree</span><span class="token3">(</span>$arr<span class="token3">,</span> $allpath<span class="token3">)</span><span class="token3">;</span> <span class="token5">return</span> $this<span class="token1">-</span><span class="token1">></span><span class="token4">clevel</span><span class="token3">(</span>$data<span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">/** * 转多层数组为二维数组, 并加上层数组别 */</span> private <span class="token5">function</span> <span class="token4">clevel</span><span class="token3">(</span>$arr<span class="token3">,</span> $num<span class="token1">=</span><span class="token6">0</span><span class="token3">)</span> <span class="token3">{</span> $this<span class="token1">-</span><span class="token1">></span>i <span class="token1">=</span> $num<span class="token3">;</span> <span class="token">//遍历多维数组</span> foreach <span class="token3">(</span>$arr as $v<span class="token3">)</span> <span class="token3">{</span> <span class="token5">if</span> <span class="token3">(</span><span class="token4">isset</span><span class="token3">(</span>$v<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>son<span class="token3">]</span><span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> <span class="token">//遍历后存在子数组情况</span> $v<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>level<span class="token3">]</span> <span class="token1">=</span> $this<span class="token1">-</span><span class="token1">></span>i<span class="token1">++</span><span class="token3">;</span><span class="token">//depath</span> $subcat <span class="token1">=</span> $v<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>son<span class="token3">]</span><span class="token3">;</span><span class="token">//将子数组临时存放</span> <span class="token4">unset</span><span class="token3">(</span>$v<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>son<span class="token3">]</span><span class="token3">)</span><span class="token3">;</span><span class="token">//删除子数组</span> $v<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>childs<span class="token3">]</span> <span class="token1">=</span> <span class="token4">trim</span><span class="token3">(</span>$v<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>childs<span class="token3">]</span><span class="token3">,</span> $this<span class="token1">-</span><span class="token1">></span>ps<span class="token3">)</span><span class="token3">;</span><span class="token">//去除多余的分隔符</span> $v<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>path<span class="token3">]</span> <span class="token1">=</span> <span class="token4">trim</span><span class="token3">(</span>$v<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>path<span class="token3">]</span><span class="token3">,</span> $this<span class="token1">-</span><span class="token1">></span>ps<span class="token3">)</span><span class="token3">;</span><span class="token">//去除多余的分隔符</span> $this<span class="token1">-</span><span class="token1">></span>narr<span class="token3">[</span>$v<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>id<span class="token3">]</span><span class="token3">]</span><span class="token1">=</span>$v<span class="token3">;</span> $this<span class="token1">-</span><span class="token1">></span><span class="token4">clevel</span><span class="token3">(</span>$subcat<span class="token3">,</span> $this<span class="token1">-</span><span class="token1">></span>i<span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">else</span> <span class="token3">{</span> $v<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>level<span class="token3">]</span> <span class="token1">=</span> $this<span class="token1">-</span><span class="token1">></span>i<span class="token3">;</span> $v<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>childs<span class="token3">]</span> <span class="token1">=</span> <span class="token4">trim</span><span class="token3">(</span>$v<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>childs<span class="token3">]</span><span class="token3">,</span> $this<span class="token1">-</span><span class="token1">></span>ps<span class="token3">)</span><span class="token3">;</span> $v<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>path<span class="token3">]</span> <span class="token1">=</span> <span class="token4">trim</span><span class="token3">(</span>$v<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>path<span class="token3">]</span><span class="token3">,</span> $this<span class="token1">-</span><span class="token1">></span>ps<span class="token3">)</span><span class="token3">;</span> $this<span class="token1">-</span><span class="token1">></span>narr<span class="token3">[</span>$v<span class="token3">[</span>$this<span class="token1">-</span><span class="token1">></span>id<span class="token3">]</span><span class="token3">]</span><span class="token1">=</span>$v<span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> $this<span class="token1">-</span><span class="token1">></span>i<span class="token1">--</span><span class="token3">;</span> <span class="token5">return</span> $this<span class="token1">-</span><span class="token1">></span>narr<span class="token3">;</span> <span class="token3">}</span> <span class="token">/** * 内部使用方法, 将按二维数组中的指定排序字段排序 */</span> private static <span class="token5">function</span> <span class="token4">compare</span><span class="token3">(</span>$x<span class="token3">,</span>$y<span class="token3">)</span><span class="token3">{</span> <span class="token5">if</span><span class="token3">(</span>$x<span class="token3">[</span>self<span class="token3">:</span><span class="token3">:</span>$order<span class="token3">]</span> <span class="token1">==</span> $y<span class="token3">[</span>self<span class="token3">:</span><span class="token3">:</span>$order<span class="token3">]</span><span class="token3">)</span> <span class="token3">{</span> <span class="token5">return</span> <span class="token6">0</span><span class="token3">;</span> <span class="token3">}</span> <span class="token4">elseif</span><span class="token3">(</span>$x<span class="token3">[</span>self<span class="token3">:</span><span class="token3">:</span>$order<span class="token3">]</span> <span class="token1"><</span> $y<span class="token3">[</span>self<span class="token3">:</span><span class="token3">:</span>$order<span class="token3">]</span><span class="token3">)</span><span class="token3">{</span> <span class="token5">return</span> <span class="token1">-</span><span class="token6">1</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">else</span> <span class="token3">{</span> <span class="token5">return</span> <span class="token6">1</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token3">}</span> ``` ``` ``` <pre class="calibre17">``` $tree<span class="token1">=</span><span class="token5">new</span> <span class="token4">Org<span class="token3">\</span>LAMP<span class="token3">\</span>CatTree</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $tree<span class="token1">-</span><span class="token1">></span><span class="token4">setId</span><span class="token3">(</span><span class="token2">'partsid'</span><span class="token3">)</span><span class="token3">;</span> $tree<span class="token1">-</span><span class="token1">></span><span class="token4">setPid</span><span class="token3">(</span><span class="token2">'parentid'</span><span class="token3">)</span><span class="token3">;</span> $tree<span class="token1">-</span><span class="token1">></span><span class="token4">setTypename</span><span class="token3">(</span><span class="token2">'pname'</span><span class="token3">)</span><span class="token3">;</span> $list<span class="token1">=</span>$tree<span class="token1">-</span><span class="token1">></span><span class="token4">getList</span><span class="token3">(</span>$partsList<span class="token3">,</span><span class="token6">true</span><span class="token3">)</span><span class="token3">;</span> ``` ```