基于ThinkPHP的二叉树左右值无限极分类实现

说明:

每个数据项都有自己的左值和右值。所有数据的左右值是连续的数字。

① 当右值比左值大1时,表示该数据无子集;

② 当某一数据项的左值大于另一数据项的左值,且该数据项的右值小于同另一数据项的右值时,该数据项属于另一数据项的子集;

例如:中国(1,8) 广东(2,5) 珠海(3,4) 江西(6,7)


数据库表结构:

CREATE TABLE `jd_category` (
  `id_category` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(24) NOT NULL,
  `lft` int(10) NOT NULL,
  `rgt` int(10) NOT NULL,
  `level` tinyint(1) NOT NULL,
  `is_del` tinyint(1) NOT NULL,
  PRIMARY KEY (`id_category`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

BTreeR 只用于实现数据读取:


  
   'level',
        'lft' => 'lft',
        'rgt' => 'rgt',
    );
    
    /**
     * 获取虚拟的顶级目录
     */
    protected function virtualTop(){
        return array(
                self::$fieldMap['level']    => -1,
                self::$fieldMap['lft']    => -1,
                self::$fieldMap['rgt']    => ((int)$this->where($this->condition)->max('rgt') + 1),
        );
        
        return $this->obj;
    }
    
    // 设置当前对象
    public function setObj( $obj ){
        if( $obj[ $this->getPk() ] && isset($obj[ self::$fieldMap['lft'] ]) && isset($obj[ self::$fieldMap['rgt'] ]) && isset($obj[ self::$fieldMap['level'] ]) ){
            $this->obj = $obj;
        }else{
            $this->obj = false;
        }
        return $this;
    }
    
    // 设置条件参数
    public function setCondition( $condition ){
        $this->condition = $condition;
        
        return $this;
    }
    
    /**
     * 是否存在父节点
     */
    public function hasParent(){
        if( !$this->obj[ $this->getPk() ] || !$this->obj[ self::$fieldMap['level'] ] ){
            return false;
        }
        
        return true;
    }
    
    
    /**
     * 查询父级节点
     * 
     * @param boolean $width_self 是否包含当前节点
     */
    public function parents( $width_self = false ){
        if( !$this->obj[ $this->getPk() ] ){
            return false;
        }
        
        $map = $this->condition;
        if( $width_self ){
     
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值