思路就是按照菜单级别level倒序,再将数组转换为以id为健名的形式,然后逐个将子级菜单作为一个元素插入到父级别中,因为是倒序所以会将各个级别的子菜单按照层级关系逐个插入到父级别中。

$list = M('authority')->where($where)->order('level desc')->select();		
$list = array_column($list, null, 'id');

foreach ($list as $key => $value)
{
	if($list[$key]['pid'] != '0')
	{
		$list[$list[$key]['pid']]['child_menu'][] = $list[$key];
		unset($list[$key]);
	}
}

RBAC表结构:

CREATE TABLE IF NOT EXISTS `authority` (
  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `menu` varchar(20) NOT NULL COMMENT '名称',
  `pid` smallint(6) unsigned NOT NULL COMMENT '父id',
  `controller` varchar(32) NOT NULL DEFAULT '' COMMENT '控制器',
  `method` varchar(32) NOT NULL DEFAULT '' COMMENT '操作方法',
  `path` varchar(32) NOT NULL COMMENT '全路径',
  `level` tinyint(4) NOT NULL DEFAULT '0' COMMENT '级别',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;