本篇文章給大家帶來的內容是關於php實現無限極分類的方法:遞歸方法
面試的時候被問到無限極分類的設計和實現,比較常見的做法是在建表的時候,增加一個PID字段用來區別自己所屬的分類
數據在數據庫中存儲大概是這個樣子,怎麼實現無限極遞歸呢,有兩種常用的做法,遞歸和引用算法
遞歸算法`
$array = array(
array('id' => 1, 'pid' => 0, 'name' => '河北省'),
array('id' => 2, 'pid' => 0, 'name' => '北京市'),
array('id' => 3, 'pid' => 1, 'name' => '邯鄲市'),
array('id' => 4, 'pid' => 2, 'name' => '朝陽區'),
array('id' => 5, 'pid' => 2, 'name' => '通州區'),
array('id' => 6, 'pid' => 4, 'name' => '望京'),
array('id' => 7, 'pid' => 4, 'name' => '酒仙橋'),
array('id' => 8, 'pid' => 3, 'name' => '永年區'),
array('id' => 9, 'pid' => 1, 'name' => '武安市'),
);
/**
* 遞歸實現無限極分類
* @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;
}
/*
* 獲得遞歸完的數據,遍歷生成分類
*/
$array = getTree($array);
//處理樣式,進行分級
foreach($array as $value){
echo str_repeat('--', $value['level']), $value['name'].'<br />';
}
打印結果
河北省
–邯鄲市
----永年區
–武安市
北京市
–朝陽區
----望京
----酒仙橋
–通州區