mycalf 发表于 2011-1-15 01:15:52

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

之前发贴,很多人都觉得我写的太简单了。没有说明。这里最近无聊,看帖子,发现是写的不够具体,代码不能直接调用,很多新手看起来会很困难。这里重新发帖,稍微详细的说明以下:
数据库表:
id
layer //层
orders //层内的排序
parent //父id,这个分类隶属于谁

name //分类名称。


models部分:

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部分:


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手册。数组部分。

mycalf 发表于 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)

lnlingyuan 发表于 2011-1-23 12:45:42

学习了。。。。

008shanke 发表于 2011-3-28 14:53:21

这个加到一定的问题 就会出错 ,在分类的过程中不能有半点错误 !所以不是很好的 万能分类!

zzyn 发表于 2011-4-1 16:42:24

递归的话 mysql 的检索效率很低的不如试试 aa_bb_cc_dd这个方式设计数据库
这个样检索的话 用like 就可以检索出 每个指定节点的所有成员比你那个效率高多了

zzyn 发表于 2011-4-1 16:49:34

id(layer_orders_parent)      name
             0_1_0                        总分类1
             0_2_0                        总分类2
             1_1_1                        总分类1的二级分类

mycalf 发表于 2011-7-4 11:44:02

zzyn 发表于 2011-4-1 16:42 static/image/common/back.gif
递归的话 mysql 的检索效率很低的不如试试 aa_bb_cc_dd这个方式设计数据库
这个样检索的话 用like 就可以 ...

都说是无递归了。。。

mycalf 发表于 2011-7-4 11:44:34

008shanke 发表于 2011-3-28 14:53 static/image/common/back.gif
这个加到一定的问题 就会出错 ,在分类的过程中不能有半点错误 !所以不是很好的 万能分类! ...

没遇到过错误,如果出错,请问什么环节容易出错?

mycalf 发表于 2011-7-4 11:58:14

zzyn 发表于 2011-4-1 16:49 static/image/common/back.gif
id(layer_orders_parent)      name
             0_1_0                        总分类1
             0 ...

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

有的时候物极必反。看上去简单的,可能是最复杂的。

gwj10zero 发表于 2011-7-21 18:31:59

成功PRINT显示了一个多维数组的分类

但,我如何在VIEW视图来foreach出这些数据啊....求解,万分感谢
页: [1] 2
查看完整版本: Codeigniter 无递归无限分类方法(2)