无限分类-树形结构两种方式

//准备数组,代替从数据库中检索出的数据(共有三个必须字段id,name,pid) 
header("content-type:text/html;charset=utf-8"); 
categories = array( 
 array('id'=>1,'name'=>'电脑','pid'=>0), 
 array('id'=>2,'name'=>'手机','pid'=>0), 
 array('id'=>3,'name'=>'笔记本','pid'=>1), 
 array('id'=>4,'name'=>'台式机','pid'=>1), 
 array('id'=>5,'name'=>'智能机','pid'=>2), 
 array('id'=>6,'name'=>'功能机','pid'=>2), 
 array('id'=>7,'name'=>'超级本','pid'=>3), 
 array('id'=>8,'name'=>'游戏本','pid'=>3), 
); 

/*方法1 利用引用*/
/*第一步 先组建以id为key的数组*/tree = array();
foreach(categories asv){
  tree[v['id']] = v;tree[v['id']]['children'] = array();
}
/*第二部 利用引用,将children添加进去,这样只遍历一次即可*/
foreach(tree as key=>v){
  if(v['pid'] != 0){tree[v['pid']]['children'] = &tree[key];//注意:此处必须传引用否则结果不对
  }
}
/*第三部 删除无用的根节点*/
foreach(tree as key=>v){
  if(v['pid'] !=0 ){
    unset(tree[key]);
  }
}


/*方法2 利用递归*/
function get_attr(arr,pid){tree = array();
  foreach(arr askey=>v){
    if(v['pid'] == pid){v['children'] = get_attr(arr,v['id']);
      if(empty(v['children'])){
        unset(v['children']);//如果为空,则删除,可选
      }
      tree[] =v;
    }
  }
  return tree;
}tree2 = get_attr($categories, 0);