如何用PHP解析Discord API的public_flags获取用户真实徽章名称
核心原理
Discord的public_flags字段采用位掩码存储规则,每个徽章对应唯一2的幂次枚举值,多个徽章的枚举值做位或(或求和,因为无重叠位)后返回。反推时只需通过**按位与运算(&)**判断对应二进制位是否为1,即可确定用户是否持有对应徽章。
完整PHP实现代码
<?php /** * 解析Discord public_flags为徽章名称组合 * @param int $publicFlags 接口返回的public_flags数值 * @return string 拼接后的徽章名称 */ function getDiscordBadges(int $publicFlags): string { // 徽章枚举值与显示名称映射,后续新增徽章仅需在此补充对应键值对即可 $badgeMap = [ 1 => 'Discord员工', 2 => '合作服务器所有者', 4 => 'HypeSquad活动成员', 8 => 'Bug猎手1级', 64 => '勇气之家成员', 128 => '智慧之家成员', 256 => '平衡之家成员', 512 => '早期支持者', 16384 => 'Bug猎手2级', 131072 => '早期认证机器人开发者' ]; $matchedBadges = []; foreach ($badgeMap as $flagValue => $badgeName) { // 按位与运算判断是否持有当前徽章 if (($publicFlags & $flagValue) === $flagValue) { $matchedBadges[] = $badgeName; } } return empty($matchedBadges) ? '无徽章' : implode(' & ', $matchedBadges); } // 测试示例:传入题目给出的public_flags值644 echo getDiscordBadges(644); // 输出结果:HypeSquad活动成员 & 智慧之家成员 & 早期支持者 ?>
验证说明
示例中的644可拆解为 4 + 128 + 512,刚好对应三个徽章的枚举值,和代码输出结果完全匹配,逻辑兼容所有徽章组合场景。
内容的提问来源于stack exchange,提问作者Matéo M.
相关产品推荐
相关产品推荐

