通常寫項目的時候,在寫一些例如後臺的欄目分類或者是商城分類的時候需要實現對應分類的上級分類,一般就會用到無限級分類來進行分類(主要是怕忘了怎麼寫,所以先記下來)
實現無限級分類,通常有兩種方法,遞歸和引用
先構造數
$arr = array(
1 => array('id' => 1, 'pid' => 0, 'name' => '中國'),
2 => array('id' => 2, 'pid' => 0, 'name' => '美國'),
3 => array('id' => 3, 'pid' => 1, 'name' => '廣東省'),
4 => array('id' => 4, 'pid' => 3, 'name' => '廣州市'),
5 => array('id' => 5, 'pid' => 4, 'name' => '天河區'),
6 => array('id' => 6, 'pid' => 1, 'name' => '湖南省'),
7 => array('id' => 7, 'pid' => 2, 'name' => '洛杉磯'),
8 => array('id' => 8, 'pid' => 6, 'name' => '長沙市'),
9 => array('id' => 9, 'pid' => 2, 'name' => '華盛頓'),
);
模擬數據庫中的數據,主要是添加pid字段方便區別分類。。。
1、遞歸
function getTree($array, $pid =0, $level = 0){
static $list = []; //定義靜態數組
foreach ($array as $key => $value){ //第一次遍歷,找到pid=0的節點
if ($value['pid'] == $pid){ //pid爲0的節點,是第一級,也就是頂級分類
$value['level'] = $level;
$list[] = $value; //把數組放到list中
unset($array[$key]); //把這個節點從數組中移除,減少後續遞歸消耗
getTree($array, $value['id'], $level+1); //開始遞歸,查找父id爲該節點id的節點,級別則爲原級別+1
}
}
return $list;
}
2、引用
/*引用傳值*/
function generateTree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0)
{
$tree = array();
$packData = array();
foreach ($list as $data) {
$packData[$data[$pk]] = $data;
}
foreach ($packData as $key => $val) {
//判斷是不是根節點,如果是那麼就把根節點數組的引用賦給新數組
if ($val[$pid] == $root) {
$tree[] = &$packData[$key];
} else {
$packData[$val[$pid]][$child][] = &$packData[$key]; //子類數組賦值給父類數組中鍵爲$child的數組
}
}
return $tree;
}