You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 17:48:18