精华区有 http://bbs.csdn.net/topics/370094009
例$area = array(
array('id'=>1,'name'=>'北京','parent'=>0),
array('id'=>2,'name'=>'河南','parent'=>0),
array('id'=>3,'name'=>'海淀','parent'=>1),
array('id'=>4,'name'=>'朝阳','parent'=>1),
array('id'=>5,'name'=>'昌平','parent'=>1),
array('id'=>6,'name'=>'上地','parent'=>3),
array('id'=>7,'name'=>'新乡','parent'=>2),
array('id'=>8,'name'=>'原阳县','parent'=>7),
);$r = find_child($area, 'id', 'parent');
print_r($r);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;
}
Array
(
[1] => Array
(
[id] => 1
[name] => 北京
[parent] => 0
[child] => Array
(
[3] => Array
(
[id] => 3
[name] => 海淀
[parent] => 1
[child] => Array
(
[6] => Array
(
[id] => 6
[name] => 上地
[parent] => 3
) ) ) [4] => Array
(
[id] => 4
[name] => 朝阳
[parent] => 1
) [5] => Array
(
[id] => 5
[name] => 昌平
[parent] => 1
) ) ) [2] => Array
(
[id] => 2
[name] => 河南
[parent] => 0
[child] => Array
(
[7] => Array
(
[id] => 7
[name] => 新乡
[parent] => 2
[child] => Array
(
[8] => Array
(
[id] => 8
[name] => 原阳县
[parent] => 7
) ) ) ) ) [3] => Array
(
[id] => 3
[name] => 海淀
[parent] => 1
[child] => Array
(
[6] => Array
(
[id] => 6
[name] => 上地
[parent] => 3
) ) ) [4] => Array
(
[id] => 4
[name] => 朝阳
[parent] => 1
) [5] => Array
(
[id] => 5
[name] => 昌平
[parent] => 1
) [6] => Array
(
[id] => 6
[name] => 上地
[parent] => 3
) [7] => Array
(
[id] => 7
[name] => 新乡
[parent] => 2
[child] => Array
(
[8] => Array
(
[id] => 8
[name] => 原阳县
[parent] => 7
) ) ) [8] => Array
(
[id] => 8
[name] => 原阳县
[parent] => 7
))在得到的结果中,开列了所有节点的子孙
比如想知道海淀的子孙,就 print_r($r[3]); 即可
由于使用了引用,所以占内存不多
如果你的原始数据是规格化好的,就可以做到几乎不多占内存
例$area = array(
array('id'=>1,'name'=>'北京','parent'=>0),
array('id'=>2,'name'=>'河南','parent'=>0),
array('id'=>3,'name'=>'海淀','parent'=>1),
array('id'=>4,'name'=>'朝阳','parent'=>1),
array('id'=>5,'name'=>'昌平','parent'=>1),
array('id'=>6,'name'=>'上地','parent'=>3),
array('id'=>7,'name'=>'新乡','parent'=>2),
array('id'=>8,'name'=>'原阳县','parent'=>7),
);$r = find_child($area, 'id', 'parent');
print_r($r);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;
}
Array
(
[1] => Array
(
[id] => 1
[name] => 北京
[parent] => 0
[child] => Array
(
[3] => Array
(
[id] => 3
[name] => 海淀
[parent] => 1
[child] => Array
(
[6] => Array
(
[id] => 6
[name] => 上地
[parent] => 3
) ) ) [4] => Array
(
[id] => 4
[name] => 朝阳
[parent] => 1
) [5] => Array
(
[id] => 5
[name] => 昌平
[parent] => 1
) ) ) [2] => Array
(
[id] => 2
[name] => 河南
[parent] => 0
[child] => Array
(
[7] => Array
(
[id] => 7
[name] => 新乡
[parent] => 2
[child] => Array
(
[8] => Array
(
[id] => 8
[name] => 原阳县
[parent] => 7
) ) ) ) ) [3] => Array
(
[id] => 3
[name] => 海淀
[parent] => 1
[child] => Array
(
[6] => Array
(
[id] => 6
[name] => 上地
[parent] => 3
) ) ) [4] => Array
(
[id] => 4
[name] => 朝阳
[parent] => 1
) [5] => Array
(
[id] => 5
[name] => 昌平
[parent] => 1
) [6] => Array
(
[id] => 6
[name] => 上地
[parent] => 3
) [7] => Array
(
[id] => 7
[name] => 新乡
[parent] => 2
[child] => Array
(
[8] => Array
(
[id] => 8
[name] => 原阳县
[parent] => 7
) ) ) [8] => Array
(
[id] => 8
[name] => 原阳县
[parent] => 7
))在得到的结果中,开列了所有节点的子孙
比如想知道海淀的子孙,就 print_r($r[3]); 即可
由于使用了引用,所以占内存不多
如果你的原始数据是规格化好的,就可以做到几乎不多占内存
学到新东西了, php引用...
难怪看了好多code都有&这个....恩,我的数据是从数据库拿的.
SELECT id, name, parent FROM table这样算规格化还是还要看里面的数据类型?
把形如
$area = array(
array('id'=>1,'name'=>'北京','parent'=>0),
array('id'=>2,'name'=>'河南','parent'=>0),
array('id'=>3,'name'=>'海淀','parent'=>1),
处理成形如
$area = array(
1 => array('id'=>1,'name'=>'北京','parent'=>0),
2 => array('id'=>2,'name'=>'河南','parent'=>0),
3 => array('id'=>3,'name'=>'海淀','parent'=>1),
即把关联键设成 id 的值直接从查询数据生成树,可参考我的另一的帖子