数组合并遇到的问题

#1 coolcool1265

Jake,我在做无限极分类的时候,用到时是左右值的方法。但是当我取出子目录【校内新闻】的父目录【新闻】时,不知道应该用哪种方法来形成path,如【新闻--》校内新闻】,而且还要有超链接。
现在做到的第一步,就遇到了一个问题。两个数组的合并。array_merge肯定是不行的了,我看了array其他的函数,除了array_merge_recursive函数外,其他函数都没有这个功能。但是这个函数是递归调用,会不会很费资源?
因为path是经常要用到的,所以想问问,如果利用左右值,有什么更好的方法没?
希望能提供一个范例。
下面是两个数组
Array
(
[id] => 5
[parentid] => 3
[name] => 校内新闻
[cover] => 0
[leftvalue] => 3
[rightvalue] => 4
)


Array
(
[id] => 3
[parentid] => 0
[name] => 新闻
[cover] => 0
[leftvalue] => 2
[rightvalue] => 7
)


//---array_merge_recursive 合并后出现的结果---
Array
(
[id] => Array
(
[0] => 5
[1] => 3
)

[parentid] => Array
(
[0] => 3
[1] => 0
)

[name] => Array
(
[0] => 校内新闻
[1] => 新闻
)

[cover] => Array
(
[0] => 0
[1] => 0
)

[leftvalue] => Array
(
[0] => 3
[1] => 2
)

[rightvalue] => Array
(
[0] => 4
[1] => 7
)

)


这个是我的sql
--
-- 表的结构 `spalbum`
--
CREATE TABLE IF NOT EXISTS `spalbum` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parentid` int(3) NOT NULL,
  `name` varchar(11) CHARACTER SET utf8 NOT NULL,
  `cover` int(11) NOT NULL,
  `leftvalue` int(3) NOT NULL,
  `rightvalue` int(3) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=16 ;
--
-- 转存表中的数据 `spalbum`
--
INSERT INTO `spalbum` (`id`, `parentid`, `name`, `cover`, `leftvalue`, `rightvalue`) VALUES
(1, -1, '_root_', 0, 1, 24),
(3, 0, '新闻', 0, 2, 7),
(10, 0, '教研', 0, 12, 23),
(5, 3, '校内新闻', 0, 3, 4),
(6, 3, '校外新闻', 0, 5, 6),
(7, 0, '公告', 0, 8, 9),
(8, 0, '德育', 0, 10, 11),
(11, 10, '语文', 0, 13, 18),
(12, 10, '数学', 0, 19, 20),
(13, 10, '英语', 0, 21, 22),
(14, 11, '精彩案例', 0, 14, 15),
(15, 11, '教学研究', 0, 16, 17);

2011-03-08 23:54:45

#2 jake

无限分类建议用“ID路径”的方式会更简单容易,左右值理解比较难、使用也难、唯一的优势是可以同级排序。“ID路径”的方式就需要 附加一个排序字段才能进行同级排序,但我觉得那不是问题。

ID路径图示

QQ截图未命名.jpg


数据是这样的,基本有两个字段:ID和ID路径

ID     ID路径
0   0
1   0,1
2   0,2
3   0,1,3
4   0,1,3,4
5   0,1,5
6   0,1,6
...

这样就形成了无限的一棵树形分类。这样有几个好处:

  • 查找单一的节点,和节点下面的全部分类,可以直接 idpath like '0,1%',就可以查出ID1下面的全部节点,而且这个like查找可以用索引,比较有效率。
  • 修改方便,不像左右值那么伤筋动骨,改动位置只要修改ID路径一个字段就行。
  • 要形成链接路径“父节点 > 子节点”也很容易,查一次在ID路径的几个ID就获取到了,然后排序按ID路径字段值的长度排序,那么直接的就区分父节点和子节点了。
  • 最大的特点:容易理解,看上面的图,基本都能理解ID路径是什么。左右值太难懂了。

2011-03-09 08:26:10

#3 冥夜

学习了:lol

2011-03-09 16:29:53

#4 coolcool1265

谢谢哈

-------------
我觉得数据库中的字段,如果是查询时候多的话,可否设计成这样:
id    parentid  name    idpath     pathname
1         0       新闻        1       新闻
2         0       教学        2       教学  
3         1      校内新闻     1,3  新闻,校内新闻   
4         1      校外新闻     1,4   新闻,校外新闻

剩下的问题就要交给前台,在smarty中实现了,有路径名,再增加相应的url就可以了。

2011-03-09 20:02:31

#5 jake

嗯,加入parentid在做程序的时候更直观一些。

2011-03-10 08:33:53

#6 vsxp

学习了。

2011-03-10 17:35:14