/** * 显示角色列表 * @param string $field */ public function roleList($is_show = false) { $this->check_permission(__FUNCTION__); if ($is_show === false) { jump('', 'pages/roleList.php', '', 0); } else { $mysql = C('mysql'); $ua_rid = $mysql->fetchAll('rid', 'user_assignment', "uid={$_SESSION['uid']}"); foreach ($ua_rid as $value) { $roleList[] = $this->recursionRole($value['rid']); } $roleList = $this->arrayUnqie(multiToOneArray($roleList)); return $roleList; } }
/** * 寻找指定角色下的所有用户 * @param number $pid * @return array */ public function usersOfRole($pid) { $mysql = C('mysql'); $result = $this->recursionUser($pid); // 找到跟此父角色有关所有子角色,并添加到$results foreach ($result as $value) { if (($res = $mysql->fetchAll('uid,rid', 'user_assignment', "rid={$value['id']}")) != false) { $results[] = $res; } } $res_ua = multiToOneArray($results); $max_offset = count($res_ua); for ($offset = 0; $offset < $max_offset; $offset++) { for ($offset_in = 0; $offset_in < $max_offset; $offset_in++) { if ($offset < $offset_in) { if ($res_ua[$offset]['uid'] == $res_ua[$offset_in]['uid']) { $res_ua[$offset] = array('uid' => '', 'rid' => ''); } } } } $my_rid = $mysql->fetchAll('rid,uid', 'user_assignment', "uid={$_SESSION['uid']}"); foreach ($my_rid as $value) { $my_rids[] = $value['rid']; $my_rids[] = $value['uid']; } $result_user = array(); foreach ($res_ua as $value) { if (!empty($value['uid'])) { $user = $mysql->fetchOne('id,name', 'user', "id={$value['uid']}"); $ua_user = $mysql->fetchAll('rid,uid', 'user_assignment', "uid={$user['id']}"); $user_rids = array(); foreach ($ua_user as $val) { $user_rids[] = $val['rid']; $user_rids[] = $val['uid']; } if (!empty(array_diff($my_rids, $user_rids))) { //如果不为空,那么这个用户的角色要么是操作用户的子集,要么两者拥有的角色互不相干 if (empty(array_diff($user_rids, $my_rids))) { //如果为空,这个用户的角色是操作用户所拥有角色的子集 $result_user[] = $mysql->fetchOne('id,name', 'user', "id={$value['uid']}"); } else { //反之,如果不为空,那么两者的角色互不相干 if (count($user_rids) === 2) { $result_user[] = $mysql->fetchOne('id,name', 'user', "id={$value['uid']}"); } elseif ($my_rids[1] == (int) 1) { $result_user[] = $mysql->fetchOne('id,name', 'user', "id={$value['uid']}"); } } } else { //反之,如果为空,则操作用户可能是该用户的子集,或者两者权限相当 if (empty(array_diff($user_rids, $my_rids))) { //如果还是为空,则对比的是自身。这里设定如果对比的两个用户角色相当则无法相互显示, //对比的是自身问题没有解决!!!!!!! //当然也可以改成可以互相显示,只需要删除$my_rids和$user_rids遍历中的uid $result_user[] = $mysql->fetchOne('id,name', 'user', "id={$value['uid']}"); } else { // 反之,操作用户是该用户的子集 } } } } return $result_user; }
/** * 将多维数组转化成一维数组 * @param array $data * @param array $results * @param number $offset * @return array */ function multiToOneArray($data, &$results = array(), $offset = 0) { foreach ($data as $key => $value) { if (is_array($data) && !is_array($value) && $offset == 0) { $results[] = $data; } if (is_array($data) && is_array($value)) { multiToOneArray($value, $results); } $offset++; } return $results; }