博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
递归 无限极分类
阅读量:5289 次
发布时间:2019-06-14

本文共 6786 字,大约阅读时间需要 22 分钟。

项目中总会遇到无限极分类,在这分享一个递归方式,如有新方法请分享一下!!!  谢谢!!! 

/*

*@content 树结构生成类
*@time 2018/7/4
*@author zh
* _ooOoo_
* o8888888o
* 88" . "88
* (| -_- |)
* O\ = /O
* ____/`---'\____
* .' \\| |// `.
* / \\||| : |||// \
* / _||||| -:- |||||- \
* | | \\\ - /// | |
* | \_| ''\---/'' | |
* \ .-\__ `-` ___/-. /
* ___`. .' /--.--\ `. . __
* ."" '< `.___\_<|>_/___.' >'"".
* | | : `- \`.;`\ _ /`;.`/ - ` : | |
* \ \ `-. \_ __\ /__ _/ .-` / /
* ======`-.____`-.___\_____/___.-`____.-'======
* `=---='
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* 佛祖保佑 永无BUG 但愿佛祖不入魔
*
* 当我写下这个的时候,只有上帝和我能够看懂
* 现在,只有上帝能看懂了
*/

class Tree {
/** * 根据父级id查询所有父级id一下的所有分类 * @start */ static public $treeList = array(); // 存放无限级分类结果 static public function create($data,$pid = 0){
foreach ($data as $key => $value){
if($value['pid'] == $pid){
self::$treeList[] = $value; unset($data[$key]); self::create($data,$value['id']); } } return self::$treeList; } /** * 分类数据处理 * @end */ /** * @var object 对象实例 */ protected static $instance; /** * 配置参数 * @var array */ protected static $config = [ 'id' => 'id', // id名称 'pid' => 'pid', // pid名称 'title' => 'title', // 标题名称 'child' => 'child', // 子元素键名 'html' => '┝ ', // 层级标记 'step' => 4, // 层级步进数量 ]; /** * 架构函数 * @param array $config */ public function __construct($config = []) {
self::$config = array_merge(self::$config, $config); } /** * 配置参数 * @param array $config * @return object */ public static function config($config = []) {
if (!empty($config)) {
$config = array_merge(self::$config, $config); } if (is_null(self::$instance)) {
self::$instance = new static($config); } return self::$instance; } /** * 将数据集格式化成层次结构 * @param array/object $lists 要格式化的数据集,可以是数组,也可以是对象 * @param int $pid 父级id * @param int $max_level 最多返回多少层,0为不限制 * @param int $curr_level 当前层数 * @return array */ public static function toLayer($lists = [], $pid = 0, $max_level = 0, $curr_level = 0) {
$trees = []; $lists = array_values($lists); foreach ($lists as $key => $value) {
if ($value[self::$config['pid']] == $pid) {
if ($max_level > 0 && $curr_level == $max_level) {
return $trees; } unset($lists[$key]); $child = self::toLayer($lists, $value[self::$config['id']], $max_level, $curr_level + 1); if (!empty($child)) {
$value[self::$config['child']] = $child; } $trees[] = $value; } } return $trees; } /** * 将数据集格式化成列表结构 * @param array|object $lists 要格式化的数据集,可以是数组,也可以是对象 * @param integer $pid 父级id * @param integer $level 级别 * @return array 列表结构(一维数组) */ public static function toList($lists = [], $pid = 0, $level = 0) {
if (is_array($lists)) {
$trees = []; foreach ($lists as $key => $value) {
if ($value[self::$config['pid']] == $pid) {
$title_prefix = str_repeat(" ", $level * self::$config['step']).self::$config['html']; $value['level'] = $level + 1; $value['title_prefix'] = $level == 0 ? '' : $title_prefix; $value['title_display'] = $level == 0 ? $value[self::$config['title']] : $title_prefix.$value[self::$config['title']]; $trees[] = $value; unset($lists[$key]); $trees = array_merge($trees, self::toList($lists, $value[self::$config['id']], $level + 1)); } } return $trees; } else {
foreach ($lists as $key => $value) {
if ($value[self::$config['pid']] == $pid && is_object($value)) {
$title_prefix = str_repeat(" ", $level * self::$config['step']).self::$config['html']; $value['level'] = $level + 1; $value['title_prefix'] = $level == 0 ? '' : $title_prefix; $value['title_display'] = $level == 0 ? $value[self::$config['title']] : $title_prefix.$value[self::$config['title']]; $lists->offsetUnset($key); $lists[] = $value; self::toList($lists, $value[self::$config['id']], $level + 1); } } return $lists; } } /** * 根据子节点返回所有父节点 * @param array $lists 数据集 * @param string $id 子节点id * @return array */ public static function getParents($lists = [], $id = '') {
$trees = []; foreach ($lists as $value) {
if ($value[self::$config['id']] == $id) {
$trees[] = $value; $trees = array_merge(self::getParents($lists, $value[self::$config['pid']]), $trees); } } return $trees; } /** * 获取所有子节点id * @param array $lists 数据集 * @param string $pid 父级id * @return array */ public static function getChildsId($lists = [], $pid = '') {
$result = []; foreach ($lists as $value) {
if ($value[self::$config['pid']] == $pid) {
$result[] = $value[self::$config['id']]; $result = array_merge($result, self::getChildsId($lists, $value[self::$config['id']])); } } return $result; } /** * 获取所有子节点 * @param array $lists 数据集 * @param string $pid 父级id * @return array */ public static function getChilds($lists = [], $pid = '') {
$result = []; foreach ($lists as $value) {
if ($value[self::$config['pid']] == $pid) {
$result[] = $value; $result = array_merge($result, self::getChilds($lists, $value[self::$config['id']])); } } return $result; } /** * 根据子分类获取顶级分类 * @param string $id 子分类id * @return int */ public static function getNavPid($id){
$catId = Category::get($id); if($catId['pid'] != 0){
return self::getNavPid($catId['pid']); } return $catId['id']; } }

转载于:https://www.cnblogs.com/wazh/p/9272124.html

你可能感兴趣的文章
Perl语言入门笔记 第十章 其他控制结构(unless,until,elsif,for,last,next,redo,and,or)
查看>>
phpunit.xml
查看>>
php实现工厂模式
查看>>
ubuntu 安装maven提示出错 The program &#39;mvn&#39; can be found in the following packages
查看>>
drwtsn32.exe 遇到问题须要关闭。我们对此引起的不便表示抱歉
查看>>
cocos2d-x3.0 Slider
查看>>
Python接口测试-使用requests模块发送GET请求
查看>>
List中的元素 去重
查看>>
7/27 进制转换
查看>>
解决nginx无法访问问题
查看>>
[老老实实学WCF] 第十篇 消息通信模式(下) 双工
查看>>
WCF随笔3----消息编码器
查看>>
通过 C# 代码操作 Google 日历
查看>>
曲演杂坛--一条DELETE引发的思考
查看>>
web测试
查看>>
POJ 3150 Cellular Automaton(矩阵乘法+二分)
查看>>
Shell 条件判断
查看>>
静态库与动态库
查看>>
java 逆波兰表达式
查看>>
代码抖动IOS 仿网易 banner scrollview 到头后 手势 事件提交到下级 拉开界面的效果...
查看>>