贴一段唠叨老大(xuzuning)写过的方法,我研读了良久,至今未懂...<? 
$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();
 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);
?>