<?
//測試數據
$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+樹概念,只用一次循環就可生成樹形數組
注冊會員,創建你的web開發資料庫,