数组无限分类,

lshfong 2011-07-02 03:27:39
$a_list = array(

1=>array('ID'=>1, 'PARENT'=>0, 'NAME'=>'祖父'),

2=>array('ID'=>2, 'PARENT'=>1, 'NAME'=>'父亲'),

3=>array('ID'=>3, 'PARENT'=>1, 'NAME'=>'叔伯'),

4=>array('ID'=>4, 'PARENT'=>2, 'NAME'=>'自己'),

5=>array('ID'=>5, 'PARENT'=>4, 'NAME'=>'儿子')

);
求一算法
如果输入父亲,返回:祖父,父亲,自己,儿子
如果输入叔伯,返回:祖父,叔伯
========================================
...全文
162 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangphp 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 t5500 的回复:]
PHP code
$a_list = array(
1=>array('ID'=>1, 'PARENT'=>0, 'NAME'=>'祖父'),
2=>array('ID'=>2, 'PARENT'=>1, 'NAME'=>'父亲'),
3=>array('ID'=>3, 'PARENT'=>1, 'NAME'=>'叔伯'),
4=>array('ID'=>4, 'PARENT'=>2, ……
[/Quote]
//
乌镇程序员 2011-07-02
  • 打赏
  • 举报
回复
实际上,在查找子节点的操作上是有问题的,因为一个节点可能有不止一个的子节点,子节点也可能有不止一个的子节点,这种情况你打算怎么处理,如果都要查询出来的话,就需要使用递归函数了。
乌镇程序员 2011-07-02
  • 打赏
  • 举报
回复
$a_list = array(
1=>array('ID'=>1, 'PARENT'=>0, 'NAME'=>'祖父'),
2=>array('ID'=>2, 'PARENT'=>1, 'NAME'=>'父亲'),
3=>array('ID'=>3, 'PARENT'=>1, 'NAME'=>'叔伯'),
4=>array('ID'=>4, 'PARENT'=>2, 'NAME'=>'自己'),
5=>array('ID'=>5, 'PARENT'=>4, 'NAME'=>'儿子')
);
$ar_ID_NAME = $ar_ID_PARENT = $ar_ID_CHILDREN = array();
foreach($a_list as $k => $v) {
$ar_ID_NAME[$v['ID']] = $v['NAME'];
$ar_ID_PARENT[$v['ID']] = $v['PARENT'];
$ar_ID_CHILDREN[$v['PARENT']][] = $v['ID'];
}

$needle = $tmp = array_search('自己', $ar_ID_NAME);
$result = '自己';
while($ar_ID_PARENT[$tmp] != 0) {
$result = $ar_ID_NAME[$ar_ID_PARENT[$tmp]].','.$result;
$tmp = $ar_ID_PARENT[$tmp];
}
while(isset($ar_ID_CHILDREN[$needle])) {
$result .= ','.$ar_ID_NAME[$ar_ID_CHILDREN[$needle][0]];
$needle = $ar_ID_CHILDREN[$needle][0];
}
echo $result;
lshfong 2011-07-02
  • 打赏
  • 举报
回复
除了递归还有办法吗
乌镇程序员 2011-07-02
  • 打赏
  • 举报
回复
$a_list = array(
1=>array('ID'=>1, 'PARENT'=>0, 'NAME'=>'祖父'),
2=>array('ID'=>2, 'PARENT'=>1, 'NAME'=>'父亲'),
3=>array('ID'=>3, 'PARENT'=>1, 'NAME'=>'叔伯'),
4=>array('ID'=>4, 'PARENT'=>2, 'NAME'=>'自己'),
5=>array('ID'=>5, 'PARENT'=>4, 'NAME'=>'儿子')
);

$s = '自己';
$result = '';
//查找索引值
function k($s, $ar) {
foreach($ar as $k => $v) if ($v['NAME'] == $s) return $k;
}

$searchID = $tmpID = k($s, $a_list);;
//查找父节点链
while($a_list[$a_list[$tmpID]['PARENT']]['PARENT'] != 0) {
$result = $a_list[$a_list[$tmpID]['PARENT']]['NAME'].','.$result;
$tmpID = $a_list[$tmpID]['PARENT'];
}
$result = '祖父,'.$result.$s;
//echo $result;

//递归查找子节点

function child($id, $ar) {
global $result;
foreach($ar as $k => $v) {
if ($v['PARENT'] == $id) {
$result .= ','.$v['NAME'];
child($v['ID'], $ar);
}
}
}
child($searchID, $a_list);
echo $result;
lshfong 2011-07-02
  • 打赏
  • 举报
回复
就是算出亲缘关系啊
只要开心就好 2011-07-02
  • 打赏
  • 举报
回复
你是要找出符合什么条件的人啊?没看懂你的题。

21,886

社区成员

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

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