精华区有 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]); 即可
由于使用了引用,所以占内存不多
如果你的原始数据是规格化好的,就可以做到几乎不多占内存

解决方案 »

  1.   

    谢谢,明天回去试试.
    学到新东西了,   php引用...
    难怪看了好多code都有&这个....恩,我的数据是从数据库拿的.
    SELECT id, name, parent FROM table这样算规格化还是还要看里面的数据类型?
      

  2.   

    函数中的 foreach($ar as $v) $t[$v[$id]] = $v; 语句就是格式化用的
    把形如
    $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 的值直接从查询数据生成树,可参考我的另一的帖子