数据库结构
- CREATE TABLE
auth_menus
(
id
int(11) NOT NULL AUTO_INCREMENT COMMENT ‘序号’,
path
varchar(100) DEFAULT NULL COMMENT ‘菜单地址’,
icon
varchar(45) DEFAULT NULL COMMENT ‘图标’,
name
varchar(30) DEFAULT NULL COMMENT ‘菜单名称’,
desc
varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT ‘备注’,
parent_id
int(11) DEFAULT ‘0’ COMMENT ‘父菜单编号,缺省0代表第一级’,
order
int(11) DEFAULT ‘0’ COMMENT ‘显示顺序’,
status
tinyint(1) DEFAULT ‘1’ COMMENT ‘状态:1 有效;0无效;’,
contr_name
varchar(255) DEFAULT NULL COMMENT ‘控制器名称’,
ctime
datetime DEFAULT NULL COMMENT ‘添加时间’,
PRIMARY KEY (id
) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8 COMMENT=‘菜单表’;
定义公共方法
/**
* @param $cate
* @param string $name
* @param int $pid
* @return array
* 封装菜单为多维数组并根据order字段排序
*/
static Public function unlimitedForLayer($cate, $name = 'children', $pid = 0)
{
//定义空数组存储数据集
$arr = array();
//循环对数据进行封装
foreach ($cate as $v) {
if ($v['status'] == 1) {
//parent_id父菜单编号,缺省0代表第一级
if ($v['parent_id'] == $pid) {
//递归调用
$v[$name] = self::unlimitedForLayer($cate, $name, $v['id']);
$arr[] = $v;
}
}
}
//对封装好的数组根据某字段进行排序进
foreach ($arr as $v) {
if (count($v['children']) > 1) {
//array_column 数组中的某列值
//array_multisort对多个数组或多维数组进行排序
array_multisort(array_column($v['children'], 'order'), SORT_DESC, $v['children']);
}
array_multisort(array_column($arr, 'order'), SORT_DESC, $arr);
}
return $arr;
}
控制器调用
/**
* 菜单列表
* @ currentPage
* @ pageSize
*/
public function index()
{
$condition = array();
$data = $this->AuthMenuModel->where($this->condition($condition))->select()->toArray();
$data = $this->AuthMenuModel->unlimitedForLayer($data);
$this->responseIOT(array('code' => '1', 'errMsg' => 'SUCCESS', 'data' => $data));
}
效果展示