http://www.php.cn/php-weizijiaocheng-353267.html
遞歸算法
/*
* 遞歸實現無限極分類
* @param $array 分類數據
* @param $pid 父ID
* @param $level 分類級別
* @return $list 分好類的數組 直接遍歷即可 $level可以用來遍歷縮進
*/
function getTree($array, $pid =0, $level = 0){
//聲明靜態數組,避免遞歸調用時,多次聲明導致數組覆蓋
static $list = [];
foreach ($array as $key => $value){
//第一次遍歷,找到父節點為根節點的節點 也就是pid=0的節點
if ($value['pid'] == $pid){
//父節點為根節點的節點,級別為0,也就是第一級
$value['level'] = $level;
//把數組放到list中
$list[] = $value;
//把這個節點從數組中移除,減少后續遞歸消耗
unset($array[$key]);
//開始遞歸,查找父ID為該節點ID的節點,級別則為原級別+1
getTree($array, $value['id'], $level+1);
}
}
return $list;
}
function generateTree($array){
//第一步 構造數據
$items = array();
foreach($array as $value){
$items[$value['id']] = $value;
}
//第二部 遍歷數據 生成樹狀結構
$tree = array();
//遍歷構造的數據
foreach($items as $key => $value){
//如果pid這個節點存在
if(isset($items[$value['pid']])){
//把當前的$value放到pid節點的son中 注意 這里傳遞的是引用 為什么呢?
$items[$value['pid']]['son'][] = &$items[$key];
}else{
$tree[] = &$items[$key];
}
}
return $tree;
}