【发布时间】:2017-07-17 03:12:18
【问题描述】:
我使用此函数返回用户及其角色和组。
我想返回具有正确索引的对象数组,这就是我创建 $index 计数器的原因。
这里的问题是,如果一个用户有超过 1 个组,我会得到重复的用户。
例如,如果我有一个用户有 3 个组,我将获得该用户 3 次。
如何避免重复用户?
我知道我需要以某种方式检查该用户是否已经存在,就像我检查了角色一样,但我不确定在哪里。
如果我将 users['$index'] 替换为 users['$id'] 则此代码将起作用,但这样我将无法获得具有正确索引的数组,而这正是我所需要的。
$stmt = $mysqli->prepare("
SELECT u.id
, u.firstName
, u.lastName
, u.email
, u.phoneNumber
, u.address
, u.birthDate
, ur.roleName
, cg.id
, cg.name
FROM users as u
LEFT
JOIN user_role as ur
ON u.id = ur.userId
LEFT
JOIN user_group as ug
on ug.userId = u.id
LEFT
JOIN control_group as cg
on cg.id = ug.groupId
WHERE u.id != ?");
$stmt->bind_param("i", $_SESSION["id"]);
$stmt->execute();
$stmt->bind_result($id, $firstName, $lastName, $email, $phoneNumber,
$address, $birthDate, $roleName, $groupId, $groupName);
$users = array();
$index = 0;
while ($stmt->fetch()) {
if (empty($users[$index])) {
$users[$index] = array(
'id' => $id,
'firstName' => $firstName,
'lastName' => $lastName,
'email' => $email,
'phoneNumber' => $phoneNumber,
'address' => $address,
'birthDate' => $birthDate,
'roles' => array(),
'groups' => array()
);
}
if ($roleName) {
$found = false;
foreach ($users[$index]['roles'] as $role) {
if($role['roleName'] == $roleName){
$found = true;
break;
}
}
if($found == false)
$users[$index]['roles'][] = array(
'roleName' => $roleName
);
}
if ($groupId) {
$found = false;
foreach ($users[$index]['groups'] as $group) {
if($group['groupName'] == $groupName){
$found = true;
break;
}
}
if($found == false)
$users[$index]['groups'][] = array(
'groupName' => $groupName
);
}
$index++;
}
$stmt->close();
$mysqli->close();
echo json_encode($users);
所以基本上我希望这样的对象
{
"id":2,
"firstName":"Jon",
"lastName":"Doe",
"email":"jon.doe@email.com",
"phoneNumber":"0621-123-444",
"address":"Address 12a",
"birthDate":"1976-01-01",
"roles":['list of role objects'],
"groups":['list of group objects']
}
我也不确定我是否以正确的方式生成对象,我想知道是否有人可以告诉我什么是正确的方法以及如何正确生成像这样的对象。
【问题讨论】:
-
你能分享一下输出吗?
-
我得到这样的输出paste.ofcode.org/4irsgF4s4qcnerArP29NfA,你可以看到用户 Mark 有 2 个组,这就是他被显示 2 次的原因......
-
@SuperMario'sYoshi 来自您的查询 r 您正在获取一个或多个用户的数据....您的意思是它为一个用户返回 3 行...?
-
我正在为许多用户获取数据,因此有可能包含许多组和角色的用户列表,我期待这样的回复 paste.ofcode.org/38W4uJDB3hPKsthh8aVdFSx ,唯一的问题是你可以看到我将用户 ID 作为索引,但我不想将用户 ID 作为索引,我想要从 0 开始的项目
-
$res = []; foreach($users as $user) { $res[] = $user; } 回声 json_encode($res);您在上面链接中显示的输出正在 $users 中考虑它,并且在您对上述代码进行逻辑执行之后,$res 将是您想要的结果