读书人

三级归类不递归是怎样实现的呢 (附测

发布时间: 2013-02-02 12:27:16 作者: rapoo

三级分类不递归是怎样实现的呢 (附测试代码) 求解
本帖最后由 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)。

读书人网 >PHP

热点推荐