• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

自己前几天写的无限分类类_php技巧

php 搞代码 3年前 (2022-01-26) 35次浏览 已收录 0个评论

前一周写的吧,使用中效果还不错。

主要思想来自:http://www.phpobject.net/b…[url=http://www.phpobject.net/blog/read.php?49][/url]

这里就不多解释原理了,直接发代码。

PS:这里代码是不能直接使用的,必须结合我的一些其他库类。应该说思想才是最重要的,这里主要提供一种分类的思路。

<?  <BR>/**  <BR>--   <BR>-- 表的结构 `daxue8_category`  <BR>--   <br><br>CREATE TABLE `daxue8_category` (  <BR>  `cid` smallint(6) NOT NULL auto_increment,  <BR>  `pid` smallint(6) NOT NULL default '0',  <BR>  `level` smallint(6) NOT NULL default '0',  <BR>  `cname` char(64) NOT NULL default '',  <BR>  `lft` smallint(6) NOT NULL default '0',  <BR>  `rgt` smallint(6) NOT NULL default '0',  <BR>  `uid` mediumint(8) NOT NULL default '0',  <BR>  `username` char(32) NOT NULL default '',  <BR>  `ctime` int(10) NOT NULL default '0',  <BR>  `cstate` tinyint(1) NOT NULL default '0',  <BR>  `gnum` mediumint(8) NOT NULL default '0',  <BR>  `orderstyle` smallint(3) NOT NULL default '0',  <BR>  PRIMARY KEY  (`cid`)  <BR>) TYPE=MyISAM AUTO_INCREMENT=2 ;  <br><br>--   <BR>-- 导出表中的数据 `daxue8_category`  <BR>--   <br><br>INSERT INTO `daxue8_category` VALUES (1, 0, 1, 'root', 1, 2, 0, '管理员', 1163608814, 1, 0, 0);  <BR>*/  <BR>class category  <BR>{  <BR>    var $module;  <br><br>    var $tbname;  <br><br>    function category()  <BR>    {  <BR>        $this->tbname=TB_PREX.'_category';  <BR>        $this->module=new module($this->tbname);  <BR>    }  <br><br>    /**  <BR>      * 增加子节点  <BR>      * @param array $node 待增加子节点的属性  <BR>      * @param int $pid 父节点的ID  <BR>    */  <BR>    function add($node,$pid){  <BR>        //检查是否已经存在该节点  <BR>        if($node_exist=$this->module->detail('where pid='.$pid.' and cname=\''.$node['cname'].'\'')){  <BR>            //$this->error(__FUNCTION__.'():该节点'.$node['cname'].'已经存在!');  <BR>            //print_r($node_exist);  <BR>            return $node_exist['cid'];  <BR>        }  <BR>        //获取父节点信息  <BR>        $pnode=$this->get_by_cid($pid);  <BR>        //更新其他节点  <BR>        $this->module->query('update `'.$this->tbname.'` set lft=lft+2 where lft>'.$pnode['rgt']);  <BR>        $this->module->query('update `'.$this->tbname.'` set rgt=rgt+2 where rgt>='.$pnode['rgt']);  <BR>        //插入新节点  <BR>        $node['pid']=$pid;  <BR>        $node['lft']=$pnode['rgt'];  <BR>        $node['rgt']=$pnode['rgt']+1;  <BR>        $node['level']=$pnode['level']+1;//层次加一  <BR>        return $this->module->add($node);  <BR>    }  <br><br>    /**  <BR>      * 删除节点  <BR>      * @param $cid 待删除的节点的ID  <BR>      * @param $delete_childern 如果该节点存在子节点,是否强制删除。设置未true,则当存在子节点的时候,删除失败,返回false  <BR>      *  <BR>    */  <BR>    function delete($cid,$delete_childern=false)  <BR>    {  <BR>        //获取节点信息  <BR>        $node=$this->get_by_cid($cid);  <BR>        if(($this->child_num($node)>0)&&(!$delete_childern))$this->error(__FUNCTION__.'():该节点存在子节点!');  <BR>        //删除该节点及其所有子节点  <BR>        $this->module->delete('where lft between '.$node['lft'].' and '.$node['rgt']);  <BR>        //修改相应的左右键值  <BR>        $plus=$node['rgt']-$node['lft']+1;  <BR>        $this->module->query('update `'.$this->tbname.'` set lft=lft-'.$plus.' where lft>'.$node['rgt']);  <BR>        $this->module->query('update `'.$this->tbname.'` set rgt=rgt-'.$plus.' where rgt>'.$node['rgt']);  <BR>        return true;  <BR>    }  <br><br>    /**  <BR>      * 更新一个节点  <BR>      * @param array $set更新集  <BR>      * @param int $cid 更新的节点的主键ID  <BR>    */  <BR>    function update($set,$cid){  <BR>        return $this->module->update($set,'where cid='.$cid);  <BR>    }  <br><br>    /**  <BR>      * 选取节点及其子节点  <BR>      * @param int $cid节点的主键ID  <BR>      * @param int $deep选取深度  <BR>    */  <BR>    function select($cid,$deep=0)  <BR>    {  <BR>        //获取节点信息  <BR>        $node=$this->get_by_cid($cid);  <BR>        $where='where lft between '.$node['lft'].' and '.$node['rgt'];  <BR>        if(!empty($deep))$where.=' and level<'.$node['level']+$deep;  <BR>        if($deep==1){  <BR>            $where.=' order by orderstyle desc';  <BR>        }else{  <BR>            $where.=' order by lft asc';              <BR>        }  <BR>        return $this->module->select($where);  <BR>    }  <br><br>    /**  <BR>      * 获取父节点路径  <BR>      * @param int $cid 节点的ID   <BR>    */  <BR>    function get_parent($cid)  <BR>    {  <BR>        $node=$this->get_by_cid($cid);  <BR>        return $this->module->select('where lft='.$node['rgt'].' order by lft asc');  <BR>    }  <BR>    /**  <BR>      * 选取子节点  <BR>      * @param int $cid节点的主键ID  <BR>      * @param int $deep选取深度  <BR>    */  <BR>    function get_children($pid,$deep=0){  <BR>        //获取节点信息  <BR>        $pnode=$this->get_by_cid($pid);  <BR>        $where='where lft>'.$pnode['lft'].' and rgt<'.$pnode['rgt'];  <BR>        if(!empty($deep))$where.=' and level<='.($pnode['level']+$deep);  <BR>        if($deep==1){  <BR>            $where.=' order by orderstyle desc';  <BR>        }else{  <BR>            $where.=' order by lft asc';              <BR>        }  <BR>        return $this->module->select($where);  <BR>    }  <br><br>    /**  <BR>      * 获取第deep层子节点  <BR>      * @param int $cid节点的主键ID  <BR>      * @param int $deep选取深度  <BR>    */  <BR>    function get_level_children($pid,$deep){  <BR>        //获取节点信息  <BR>        $pnode=$this->get_by_cid($pid);  <BR>        $where='where lft>'.$pnode['lft'].' and rgt<'.$pnode['rgt'];  <BR>        $where.=' and level='.($pnode['level']+$deep);  <BR>        $where.=' order by orderstyle desc';  <BR>        return $this->module->select($where);  <BR>    }  <br><br>    /**  <BR>      * 获取节点信息  <BR>      * @param $cid 节点的主键ID  <BR>      * @return array $node  <BR>    */  <BR>    function get_by_cid($cid){  <BR>        $node=$this->module->detail('where cid='.$cid);  <BR>        if(!$node)$this->error(__FUNCTION__.'():获取节点'.$cid.'失败!');  <BR>        return $node;  <BR>    }  <BR>    /**  <BR>      * 获取子节点的数目  <BR>      * @param array $node 节点信息  <BR>      * @return num  <BR>    */  <BR>    function child_num($node){  <BR>        return ($node['rgt']-$node['lft']-1)/2;  <BR>    }  <BR>    /**  <BR>      * 按照层次显示分类  <BR>      * @param int $cid节点的主键ID  <BR>      * @output  <BR>    */  <BR>    function display($cid)  <BR>    {  <BR>        $nodes=$this->select($cid);  <BR>        foreach($nodes as $node){  <BR>            echo str_repeat('   ',$node['level']-1).$node['cname']."\n"<strong>+本文来源gao@daima#com搞(%代@#码网</strong><pre>搞代gaodaima码

;
}
}
/*——-private———————————–*/

function error($msg){
die(‘ERROR : file ‘.__FILE__.’ function ‘.$msg);
}
}
?>


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:自己前几天写的无限分类类_php技巧
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址