Массив объектов возвращает одинаковые значения

Я использую эту функцию, чтобы возвращать пользователям свои роли и группы.

Я хочу вернуть массив объектов с правильным индексом, поэтому я создал счетчик $ index.

Проблема здесь в том, что я получаю дубликатов пользователей, если один пользователь имеет более 1 группы.

Так, например, если у меня есть один пользователь с 3 группами, я получу этого пользователя 3 раза.

Как избежать дублирования пользователей?

Я знаю, что мне почему-то нужно проверить, существует ли этот пользователь, например, я проверил роли, но я не уверен, где.

Этот код будет работать, если я заменил пользователей ['$ index'] на пользователей ['$ 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'] } 

Также я не уверен, что если я создаю объект на правильном пути, мне бы хотелось, чтобы кто-то мог сказать мне, что такое правильный подход и как правильно генерировать объект, подобный этому.