请问楼主你的数组中是不是
Array  
(  
       [0]  =>  Array  
               (  
                       [as_id]  =>  6aaa3f89bba3d5b222073f2c5bb1bcae  
                       [as_name]  =>  食品、饮料  
                       [parent_id]  =>  0  
               )  
}
如果比较大的话是不是这种情况:Array  
(  
       [0]  =>  Array  
               (  
                       [as_id]  =>  6aaa3f89bba3d5b222073f2c5bb1bcae  
                       [as_name]  =>  食品、饮料  
                       [parent_id]  =>  0  
               )  
   ....
       [n]  =>  Array  
               (  
                       [as_id]  =>  6aaa3f89bba3d5b222073f2c5bb1bcae  
                       [as_name]  =>  食品、饮料  
                       [parent_id]  =>  0  
               )  
}
是不是这种情况?

解决方案 »

  1.   

    用“递归循环”+“引用”比较好实现参考
    http://expert.csdn.net/Expert/TopicView1.asp?id=2980875
    里面的“递归循环”
      

  2.   

    <?PHP
    $arrtest=Array(0=>Array('as_id'=>"6aaa3f89bba3d5b222073f2c5bb1bcae",
                           'as_name'=>"食品、饮料",  
                           'parent_id'=>0
                   ),1=>Array( 'as_id'=>"053dca7d73ddc3df57309301a7df030e",  
                    'as_name'=>"乳制品",  
                    'parent_id'=>"6aaa3f89bba3d5b222073f2c5bb1bcae"  
                   ),
     
           2  =>  Array  
                   (  
                           'as_id'=>"0b0364d0af099368e4d9734c8de6faf2",  
                           'as_name'=>"二手食品饮料加工设备",  
                           'parent_id'=>"6aaa3f89bba3d5b222073f2c5bb1bcae"
                   ),  
     
           3  =>  Array  
                   (  
                          'as_id'=>"12fd5b7ad57a5162edf058d3dfcb7d34",  
                           'as_name'=>"休闲食品",  
                           'parent_id'=>"6aaa3f89bba3d5b222073f2c5bb1bcae"  
                   ),  
     
           4  =>  Array  
                   (  
                           'as_id'=>"5b6088d469bce4fccae8cf517e5a5176",  
                           'as_name'=>"保健食(药)品",  
                           'parent_id'=>"6aaa3f89bba3d5b222073f2c5bb1bcae"
                   ),  
     
           5  =>  Array  
                   (  
                           'as_id'=>"bb6efddf7e4ecbe5aa24cd0fcc253eac",
                           'as_name'=>"其他未分类",  
                           'parent_id'=>"6aaa3f89bba3d5b222073f2c5bb1bcae"
                   ) 
     ); 
      function distree($arr,$str_id)
      {   
          $distree=array();
      $j=0;
      for($i=0;$i<count($arr);$i++)
      {
      if ($arr[$i]['parent_id']==$str_id){
          $distree[$j]['as_id']=$arr[$i]['as_id'];
          $distree[$j]['as_name']=$arr[$i]['as_name'];
          $distree[$j]['parent_id']=$arr[$i]['parent_id'];
          $t=0;
          for($y=0;$y<count($arr);$y++){
           $distree1=array();
           if(($arr[$y]['parent_id']==$arr[$i]['as_id'])){
           $distree[$j]['child'][$t]['as_id']=$arr[$y]['as_id'];
           $distree[$j]['child'][$t]['as_name']=$arr[$y]['as_name'];      
           $distree[$j]['child'][$t]['parent_id']=$arr[$y]['parent_id']; 
           $t++;     
           }
          }
          $j++;
      }
      }
          return $distree;
      } 
    print "<pre>";
      print_r(distree($arrtest,0)); 
      print "</pre>";
    ?>
    这是笨方法,一会把递归的写上来(调试中)。
      

  3.   

    通常解决这个问题都是用递归来完成的,这里给一个不用递归的算法
    <?
    //测试数据
    $ar = array(
    array(id=>1,pid=>0),
    array(id=>2,pid=>0),
    array(id=>3,pid=>2),
    array(id=>4,pid=>0),
    array(id=>5,pid=>3),
    array(id=>6,pid=>1),
    array(id=>7,pid=>1),
    array(id=>8,pid=>6),
    array(id=>9,pid=>7),
    array(id=>10,pid=>9)
    );//排序函数
    function cmd($a,$b) {
      if($a[pid]==$b[pid]) return 0;
      return $a[pid]>$b[pid]?1:-1;
    }//排序,为避免数据中父节点在子节点后面出现,这种情况在多次修改数据后经常会发生的
    //排序的目的就是防止这种情况造成的混乱
    uasort($ar,cmd);//定义目标数组
    $d = array();
    //定义索引数组,用于记录节点在目标数组的位置
    $ind = array();foreach($ar as $v) {
      $v[child] = array(); //给每个节点附加一个child项
      if($v[pid] == 0) {
        $i = count($d);
        $d[$i] = $v;
        $ind[$v[id]] =& $d[$i];
      }else {
        $i = count($ind[$v[pid]][child]);
        $ind[$v[pid]][child][$i] = $v;
        $ind[$v[id]] =& $ind[$v[pid]][child][$i];
      }
    }
    //检查结果
    print_r($d);
    ?>本算法的特点在于利用“穿线的B+树”和php的传址算符“&”,只用一个循环就可完成到“树”的转换