发布两个不用递归的树形数组构造函数

xuzuning 2011-07-28 03:27:52
加精
发布两个不用递归的树形数组构造函数
/**
* 创建父节点树形数组
* 参数
* $ar 数组,邻接列表方式组织的数据
* $id 数组中作为主键的下标或关联键名
* $pid 数组中作为父键的下标或关联键名
* 返回 多维数组
**/
function find_parent($ar, $id='id', $pid='pid') {
foreach($ar as $v) $t[$v[$id]] = $v;
foreach ($t as $k => $item){
if( $item[$pid] ){
if( ! isset($t[$item[$pid]]['parent'][$item[$pid]]) )
$t[$item[$id]]['parent'][$item[$pid]] =& $t[$item[$pid]];
}
}
return $t;
}


/**
* 创建子节点树形数组
* 参数
* $ar 数组,邻接列表方式组织的数据
* $id 数组中作为主键的下标或关联键名
* $pid 数组中作为父键的下标或关联键名
* 返回 多维数组
**/
function find_child($ar, $id='id', $pid='pid') {
foreach($ar as $v) $t[$v[$id]] = $v;
foreach ($t as $k => $item){
if( $item[$pid] ) {
$t[$item[$pid]]['child'][$item[$id]] =& $t[$k];
}
}
return $t;
}

示例
$data = array(
array('ID'=>1, 'PARENT'=>0, 'NAME'=>'祖父'),
array('ID'=>2, 'PARENT'=>1, 'NAME'=>'父亲'),
array('ID'=>3, 'PARENT'=>1, 'NAME'=>'叔伯'),
array('ID'=>4, 'PARENT'=>2, 'NAME'=>'自己'),
array('ID'=>5, 'PARENT'=>4, 'NAME'=>'儿子'),
);

$p = find_parent($data, 'ID', 'PARENT');
$c = find_child($data, 'ID', 'PARENT');


...全文
7994 92 打赏 收藏 转发到动态 举报
写回复
用AI写文章
92 条回复
切换为时间正序
请发表友善的回复…
发表回复
包菜大GG 2012-07-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
,,奥妙在于 &

注意函数名find_parent, find_child,并非构造整个上下级树
[/Quote]

请大侠指点一下个 & 我也深知奥妙在于此,但是实在是想不通啊
夜落_朦空 2012-05-28
  • 打赏
  • 举报
回复
find_parent理解了,
find_child有点没懂。
abiao5555 2011-12-05
  • 打赏
  • 举报
回复
正是我想要的东西
谢谢楼主分享
重复的昵称嘛 2011-08-12
  • 打赏
  • 举报
回复
我冲楼主的 “100%”来的。。
jjmilk13 2011-08-10
  • 打赏
  • 举报
回复
只在测试回贴功能。
wxydwpp 2011-08-09
  • 打赏
  • 举报
回复
学些了 !!!!
老狗 2011-08-09
  • 打赏
  • 举报
回复
不错了 楼主谢谢
z52722057 2011-08-09
  • 打赏
  • 举报
回复
顶搂主,数组在php里面非常灵活.
但是有几个疑问
1.函数1中有一段代码copy如下
if( ! isset($t[$item[$pid]]['parent'][$item[$pid]]) )
$t[$item[$id]]['parent'][$item[$pid]] =& $t[$item[$pid]];
1) $t[$item[$id]]['parent'][$item[$pid]] =& $t[$item[$pid]];
为什么不写成 $t[$item[$id]]['parent'] =& $t[$item[$pid]];
难道树中一个节点有几个父节点?

2)if( ! isset($t[$item[$pid]]['parent'][$item[$pid]]) ) 我认为这个判断永远成立
这个问题是跟1)中是一样的,parent后面接的是自己的id还是pid呢?
从$t[$item[$id]]['parent'][$item[$pid]] =& $t[$item[$pid]];中看到是pid
从if中看到的是自己的id,所以这里和1)是一样的. 废话了

2.为什么不把两个函数合并,这样不是即可以找父节点,也可以找子节点列表?

3.既然是树,肯定要遍历. 但是我找不到根在哪,是否需要返回一个根id呢?
有了根id和数组写个二维数组就可以遍历了
wlgee 2011-08-08
  • 打赏
  • 举报
回复
新人前来参观学习~
qq103484947 2011-08-08
  • 打赏
  • 举报
回复
这种不算递归么?感觉还是递归吖,只不过是定义了节点id而已
xiyue111 2011-08-08
  • 打赏
  • 举报
回复
辛苦辛苦了。不过看起来很深奥哦。
space_ss 2011-08-08
  • 打赏
  • 举报
回复
一堆美刀 额喜欢
h1021631761 2011-08-08
  • 打赏
  • 举报
回复
thankyou
boxun123 2011-08-08
  • 打赏
  • 举报
回复
占楼学习!
lmc158 2011-08-08
  • 打赏
  • 举报
回复
/**
* 创建父节点树形数组
* 参数
* $ar 数组,邻接列表方式组织的数据
* $id 数组中作为主键的下标或关联键名
* $pid 数组中作为父键的下标或关联键名
* 返回 多维数组
**/
function find_parent($ar, $id='id', $pid='pid') {
foreach($ar as $v) $t[$v[$id]] = $v;
foreach ($t as $k => $item){
if( $item[$pid] ){
if( ! isset($t[$item[$pid]]['parent'][$item[$pid]]) )
$t[$item[$id]]['parent'][$item[$pid]] =& $t[$item[$pid]];
}
}
return $t;
}


/**
* 创建子节点树形数组
* 参数
* $ar 数组,邻接列表方式组织的数据
* $id 数组中作为主键的下标或关联键名
* $pid 数组中作为父键的下标或关联键名
* 返回 多维数组
**/
function find_child($ar, $id='id', $pid='pid') {
foreach($ar as $v) $t[$v[$id]] = $v;
foreach ($t as $k => $item){
if( $item[$pid] ) {
$t[$item[$pid]]['child'][$item[$id]] =& $t[$k];
}
}
return $t;
}
sunjwater 2011-08-08
  • 打赏
  • 举报
回复
谢谢分享,多多学习!!
zhan7505201 2011-08-07
  • 打赏
  • 举报
回复
学习。
aydf1 2011-08-07
  • 打赏
  • 举报
回复
版主辛苦了,多谢分享
pp221422 2011-08-07
  • 打赏
  • 举报
回复
谢谢版主。。学习了。。
随枫而来 2011-08-06
  • 打赏
  • 举报
回复
学习一下
加载更多回复(61)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧