用户
 找回密码
 入住 CI 中国社区
搜索
查看: 10619|回复: 14
收起左侧

Codeigniter 无递归无限分类方法(2)

[复制链接]
发表于 2011-1-15 01:15:52 | 显示全部楼层 |阅读模式
之前发贴,很多人都觉得我写的太简单了。没有说明。这里最近无聊,看帖子,发现是写的不够具体,代码不能直接调用,很多新手看起来会很困难。这里重新发帖,稍微详细的说明以下:
数据库表:
id
layer //层
orders //层内的排序
parent //父id,这个分类隶属于谁

name //分类名称。


models部分:
PHP复制代码
 
function channels($id){
 
$this->db->order_by("layer", "asc"); //分类所在的层,比如总分类是0的话,那么它的下级分类就是1,1的下级分类就是2。
$this->db->order_by("orders", "asc"); //orders 排序,这里对分类,不是必须的。可以没有,但是分类后终归要把你的分类进行排序的。
$data = $this->db->get('你的表名'); //这里不多解释了。
 
foreach($data->result_array() as $row) {
            if($row['parent'] == $id) {  //这里说明一下,这里的$id是定义父id的。如果你要调用某个分类下面的所有分类,那么$id就应该等于这个分类的id。
                $result[$row['id']] = $row;
                $index[$row['id']] =& $result[$row['id']];
            }else {
                $index[$row['parent']][$row['id']] = $row;
                $index[$row['id']] =& $index[$row['parent']][$row['id']];
            }
        }
        return $result;
}
 
 
复制代码





Controller部分:

PHP复制代码
 
function index()
{
$this->load->model('models'); //调用你的models类。上面的models部分,你写在那个models里,你就调用那个文件
$data=$this->models->channels('id'); //如果是0则调用所有的数据,否则id应该等于你要调用分类的id,函数会列出你要调用分类的下面所有的分类。
 
echo "<pre>";
print_r($data);  //看看和你的数据是不是一样的。
echo "</pre>";
}
 
 
复制代码




这种分类方式,如果把一切不需要的东西,都去掉。最多只需要3个字段,就可以完成无递归分类。简单可靠。

输出的数据是一个多维数组,你可以把它导入到你的views中,在里面进行处理。

数组操作不熟悉的,可以看php手册。数组部分。

评分

参与人数 2威望 +10 收起 理由
fssnoo + 5 赞一个!
Hex + 5 很给力!

查看全部评分

 楼主| 发表于 2011-1-15 01:20:19 | 显示全部楼层
补充一下。你的主分类数据应该是这样形式的:

    id          layer     orders       parent        name
自动生成       0            1              0           总分类1
自动生成       0            2              0           总分类2
自动生成       1            1              1           总分类1的二级分类(这里假定总分类1的id为1)
发表于 2011-1-23 12:45:42 | 显示全部楼层
学习了。。。。
发表于 2011-3-28 14:53:21 | 显示全部楼层
这个加到一定的问题 就会出错 ,在分类的过程中不能有半点错误 !所以不是很好的 万能分类!
发表于 2011-4-1 16:42:24 | 显示全部楼层
递归的话 mysql 的检索效率很低的  不如试试 aa_bb_cc_dd这个方式设计数据库
这个样检索的话 用like 就可以检索出 每个指定节点的所有成员  比你那个效率高多了
发表于 2011-4-1 16:49:34 | 显示全部楼层
id(layer_orders_parent)        name
             0_1_0                        总分类1
             0_2_0                        总分类2
             1_1_1                        总分类1的二级分类
 楼主| 发表于 2011-7-4 11:44:02 | 显示全部楼层
zzyn 发表于 2011-4-1 16:42
递归的话 mysql 的检索效率很低的  不如试试 aa_bb_cc_dd这个方式设计数据库
这个样检索的话 用like 就可以 ...

都说是无递归了。。。
 楼主| 发表于 2011-7-4 11:44:34 | 显示全部楼层
008shanke 发表于 2011-3-28 14:53
这个加到一定的问题 就会出错 ,在分类的过程中不能有半点错误 !所以不是很好的 万能分类! ...

没遇到过错误,如果出错,请问什么环节容易出错?
 楼主| 发表于 2011-7-4 11:58:14 | 显示全部楼层
zzyn 发表于 2011-4-1 16:49
id(layer_orders_parent)        name
             0_1_0                        总分类1
             0 ...

几个问题,
1、写再一个表里,虽然是减少了读取mysql的次数,减少2次。但也相应的增加了php的运算。
2、获取特定分类的下属分类,变得非常麻烦。我读取1大分类的下属分类,直接调用大分类等于1的所有数据就够了。而你这个,我估计要麻烦许多。
3、修改分类归属时,我只修改一个字段,不需要做任何处理。你这个需要php先进行处理再写入。

有的时候物极必反。看上去简单的,可能是最复杂的。
发表于 2011-7-21 18:31:59 | 显示全部楼层
成功PRINT显示了一个多维数组的分类

但,我如何在VIEW视图来foreach出这些数据啊....求解,万分感谢

本版积分规则