仅供参考: //控制器 $data = M('category')->select(); $datas = D('Category')->_getTree($data, 0,0,TRUE);
$datas = $this->echo_tree($datas); print_r($datas);die; //递归取出分类 public function _getTree($data, $parent_id=0, $level=0, $isClear = FALSE){ static $ret = array(); if($isClear) $ret = array(); foreach ($data as $k => $v) { if($v['parentid'] == $parent_id) { // 把level放到这个权限中用来标记当前这个权限是第几级的 $v['level'] = $level; $ret[] = $v; // 再找当前这个权限的子权限 $this->_getTree($data, $v['id'], $level+1); } } return $ret; } public function _getTrees($array, $pid =0, $level = 0){ //声明静态数组,避免递归调用时,多次声明导致数组覆盖 static $list = []; foreach ($array as $key => $value){ // print_r($value);die; //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点 if ($value['parentid'] == $pid){ //父节点为根节点的节点,级别为0,也就是第一级 $value['level'] = $level; //把数组放到list中 $list[] = $value; //把这个节点从数组中移除,减少后续递归消耗 // unset($array[$key]); //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1 $this-> _getTrees($array, $value['id'], $level+1); } } return $list; }
上面两种方法只是标记的哪个是以及,哪个是二级,下面再用个暴力点的,直接直观的显示出来等级的划分
/** * 输出树结构 * @param array 数据源 * @return void */ function echo_tree($tree) { foreach ($tree as $row) { for ($i = $row['level']; $i > 0; $i--) { echo '|----'; } echo $row['name']; echo '<br>'; } }