PHP开发11级推荐系统:如何按值查找嵌套数组对应层级键名
根据用户ID反查推荐层级实现方案
从你给出的数组打印格式判断使用的是PHP环境,针对「层级键为键名、对应用户ID列表为键值」的数组结构,可通过以下两种方式实现ID到层级的查询:
方法1:单次查询直接遍历(适合查询频次低的场景)
直接遍历每层的用户列表,匹配到目标ID后直接返回对应层级名,全PHP版本兼容:
// 原始层级关系数组 $levelList = [ 'L1' => ['TL422632', 'TL626461'], 'L2' => ['TL4321', 'TL191123'], 'L3' => ['TL555938'], 'L4' => ['TL197752'], 'L5' => ['TL835309'], 'L6' => ['TL495903'], 'L7' => ['TL207447'], 'L8' => ['TL427427'], 'L9' => ['TL288884'], 'L10' => ['TL251399'], 'L11' => ['TL284394'], ]; /** * 根据用户ID查询所属层级 * @param string $userId 目标用户ID * @param array $levelList 层级关系数组 * @return string|null 匹配到返回层级名,未匹配到返回null */ function findUserLevel(string $userId, array $levelList): ?string { foreach ($levelList as $levelName => $users) { // 严格模式匹配,避免类型隐式转换导致误判 if (in_array($userId, $users, true)) { return $levelName; } } return null; } // 调用示例 echo findUserLevel('TL284394', $levelList); // 输出 L11
方法2:预处理反向映射(适合高频查询场景)
如果业务中需要多次查询不同用户的层级,建议提前把原数组处理成用户ID => 层级名的键值对映射,后续查询直接读取映射数组即可,时间复杂度为O(1),性能远高于每次遍历:
// 预处理生成反向映射,仅需执行一次 $userLevelMap = []; foreach ($levelList as $levelName => $users) { foreach ($users as $uid) { // 可选:加重复校验,避免脏数据(同一用户出现在多个层级) if (isset($userLevelMap[$uid])) { trigger_error("用户{$uid}层级重复,已绑定{$userLevelMap[$uid]},当前遍历到{$levelName}", E_USER_WARNING); continue; } $userLevelMap[$uid] = $levelName; } } // 后续查询无需遍历,直接读取即可 echo $userLevelMap['TL284394']; // 输出 L11 echo $userLevelMap['TL422632']; // 输出 L1
注意:如果你的业务规则要求每个用户仅能属于一个层级,建议保留上面代码里的重复校验逻辑,提前发现源数据的异常问题,避免层级计算错误。
内容的提问来源于stack exchange,提问作者SRR
相关产品推荐
相关产品推荐

