遞歸
$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' => '朝陽區(qū)'),
array('id' => 5, 'pid' => 2, 'name' => '通州區(qū)'),
array('id' => 6, 'pid' => 4, 'name' => '望京'),
array('id' => 7, 'pid' => 4, 'name' => '酒仙橋'),
array('id' => 8, 'pid' => 3, 'name' => '永年區(qū)'),
array('id' => 9, 'pid' => 1, 'name' => '武安市'),
);
/**
* 遞歸實(shí)現(xiàn)無限極分類
* @param $array 分類數(shù)據(jù)
* @param $pid 父ID
* @param $level 分類級別
* @return $list 分好類的數(shù)組 直接遍歷即可 $level可以用來遍歷縮進(jìn)
*/
function getTree($array, $pid =0, $level = 0){
//聲明靜態(tài)數(shù)組,避免遞歸調(diào)用時(shí),多次聲明導(dǎo)致數(shù)組覆蓋
static $list = [];
foreach ($array as $key => $value){
//第一次遍歷,找到父節(jié)點(diǎn)為根節(jié)點(diǎn)的節(jié)點(diǎn) 也就是pid=0的節(jié)點(diǎn)
if ($value['pid'] == $pid){
//父節(jié)點(diǎn)為根節(jié)點(diǎn)的節(jié)點(diǎn),級別為0,也就是第一級
$value['level'] = $level;
//把數(shù)組放到list中
$list[] = $value;
//把這個(gè)節(jié)點(diǎn)從數(shù)組中移除,減少后續(xù)遞歸消耗
unset($array[$key]);
//開始遞歸,查找父ID為該節(jié)點(diǎn)ID的節(jié)點(diǎn),級別則為原級別+1
getTree($array, $value['id'], $level+1);
}
}
return $list;
}
/*
* 獲得遞歸完的數(shù)據(jù),遍歷生成分類
*/
$array = getTree($array);
foreach($array as $value){
echo str_repeat('--', $value['level']), $value['name'].'<br />';
}
引用
$array = array(
array('auth_id' => 100, 'auth_name' => '后臺(tái)首頁', 'auth_pid' => 0),
array('auth_id' => 116, 'auth_name' => '管理員', 'auth_pid' => 0),
array('auth_id' => 120, 'auth_name' => '管理員列表', 'auth_pid' => 116),
array('auth_id' => 121, 'auth_name' => '管理員添加', 'auth_pid' => 116),
array('auth_id' => 122, 'auth_name' => '數(shù)據(jù)一覽', 'auth_pid' => 100),
array('auth_id' => 123, 'auth_name' => '更新日志', 'auth_pid' => 100),
array('auth_id' => 124, 'auth_name' => '猜猜看', 'auth_pid' => 123),
);
function generateTree($data){
//構(gòu)建一個(gè)新數(shù)組,key為自己的id,為第二步做鋪墊
$items = array();
foreach($data as $v){
$items[$v['auth_id']] = $v;
}
$tree = array();
foreach($items as $k => $item){
//判斷是否是頂級分類
if(isset($items[$item['auth_pid']])){
$items[$item['auth_pid']]['son'][] = &$items[$k]; //引用賦值
}else{
$tree[] = &$items[$k];
}
}
return $tree;
}
$data = generateTree($array);