首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > PHP >

三级归类不递归是怎样实现的呢 (附测试代码) 求解

2013-02-02 
三级分类不递归是怎样实现的呢 (附测试代码)求解本帖最后由 anydy2008 于 2013-01-06 12:07:44 编辑看了几

三级分类不递归是怎样实现的呢 (附测试代码) 求解
本帖最后由 anydy2008 于 2013-01-06 12:07:44 编辑 看了几天前的一个帖子  
http://bbs.csdn.net/topics/390331161
当中有snmr_com 的热心回复,提到不递归实现分类的方法。

我就想,按照这个逻辑可否将类别实现树形数组结构呢。
下面是我用递归形式生成的  代码如下:


<?
$arr = array(
    
    array('id'=>1,'city_name'=>'中国','rel_id'=>'1','pid'=>0),
    array('id'=>2,'city_name'=>'广东','rel_id'=>'1-2','pid'=>1),
    array('id'=>3,'city_name'=>'深圳','rel_id'=>'1-2-3','pid'=>2),
    array('id'=>4,'city_name'=>'广州','rel_id'=>'1-2-4','pid'=>2)
   
);

function find_subclass( $pid ){
    
    global $arr;
    $__arr = array();
    foreach ( $arr as $k=>$v )
    {
        
        if( $v['pid']==$pid )$__arr[] = $v;
        
    }
    return $__arr;
    
}

function tree_subclass($pid=0){
    
    $__arr = array();
    $__arr = find_subclass($pid);
    if( !empty($__arr) ){
        
        foreach ( $__arr as $k=>$v )
        {

            $__arr[$k]['subclass'] = tree_subclass($v['id']);
            
        }
        
    }
    return $__arr;
}

var_dump(tree_subclass(0));

?>




期望通过不递归的形式得到的数组结构:


array(1) {
  [0]=>
  array(5) {
    ["id"]=>
    int(1)
    ["city_name"]=>
    string(4) "中国"
    ["rel_id"]=>
    string(1) "1"
    ["pid"]=>
    int(0)
    ["subclass"]=>
    array(1) {
      [0]=>
      array(5) {
        ["id"]=>
        int(2)
        ["city_name"]=>
        string(4) "广东"
        ["rel_id"]=>
        string(3) "1-2"
        ["pid"]=>
        int(1)
        ["subclass"]=>
        array(2) {
          [0]=>
          array(5) {
            ["id"]=>


            int(3)
            ["city_name"]=>
            string(4) "深圳"
            ["rel_id"]=>
            string(5) "1-2-3"
            ["pid"]=>
            int(2)
            ["subclass"]=>
            array(0) {
            }
          }
          [1]=>
          array(5) {
            ["id"]=>
            int(4)
            ["city_name"]=>
            string(4) "广州"
            ["rel_id"]=>
            string(5) "1-2-4"
            ["pid"]=>
            int(2)
            ["subclass"]=>
            array(0) {
            }
          }
        }
      }
    }
  }
}



每项如果有子类   就用subclass键放。 类别层数限定为三级。
求助大神,用不递归的方式实现;先感谢啦!

三级分类 php分类 不递归分类
[解决办法]
其实左右值算法不难理解的。
分类,肯定是个树状结构。

我们把每一个节点,都设置一个左值和一个右值

                      (1)root(14)
               /                       \
          (2)a (7)                   (8)b(13)
        /        \                     /        \
 (3)c(4)     (5)d(6)    (9)e(10)       (11) f(12)       

当你要获取节点a的子节点时,只需要判断>a的左值<a的右值.就可以得到他的子节点了。而不需要遍历整棵树。

那么你在db里面存储时,就按照这个结构来存。并且把left_value和right_value都建立索引。
my_categorys:
---------------
id    name   left_value   right_value


1     root     1                14
2     a          2                7       
3     b          8                13
4     c           3                4
...

sql查a节点的所有子节点:select * from my_categorys where left_value > 2 and right_value < 7。
就得到了(3)c(4)和(5)d(6)。

热点排行