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

PHP优化:基于映射数组替换用户数组键,求更优实现方案

优化用户属性键名映射函数的方案

原代码的几个问题

  • 用array_search做线性查找,映射数组规模大的时候效率偏低
  • 直接修改原$user数组,容易产生意外的副作用
  • 判断条件$newKey != 0存在逻辑漏洞:若新键为0会被误过滤,且未正确处理array_search返回false(无对应映射)的情况

优化后的实现方案

方案1:反转映射数组+快速构建新数组

先把映射数组反转,变成「原属性键 => 目标键」的结构,这样查找新键的时间复杂度降到O(1),同时避免修改原数组:

function mapAttributes(array $users, array $mappingAttributes): array
{
    // 反转映射数组,实现原键到新键的快速查找
    $reverseMapping = array_flip($mappingAttributes);
    
    return array_map(function($user) use ($reverseMapping) {
        $mappedUser = [];
        foreach ($user as $oldKey => $value) {
            // 仅处理存在映射的键
            if (isset($reverseMapping[$oldKey])) {
                $mappedUser[$reverseMapping[$oldKey]] = $value;
            }
            // 若需要保留无映射的键,取消下面注释
            // else {
            //     $mappedUser[$oldKey] = $value;
            // }
        }
        return $mappedUser;
    }, $users);
}

方案2:利用数组函数简化代码

如果只需要保留有映射的属性,可以用更简洁的数组函数组合实现:

function mapAttributes(array $users, array $mappingAttributes): array
{
    $reverseMapping = array_flip($mappingAttributes);
    
    return array_map(function($user) use ($reverseMapping) {
        // 筛选出存在映射的键值对
        $filtered = array_intersect_key($user, $reverseMapping);
        // 替换键名并返回新数组
        return array_combine(array_map(fn($k) => $reverseMapping[$k], array_keys($filtered)), $filtered);
    }, $users);
}

测试验证

用你提供的示例输入测试:

$users = [
    [
        "givenName" => "John",
        "surname" => "Doe"
    ]
];

$mappingAttributes = [
    "firstName" => "givenName",
    "lastName" => "surname"
];

print_r(mapAttributes($users, $mappingAttributes));

输出结果符合预期:

Array
(
    [0] => Array
        (
            [firstName] => John
            [lastName] => Doe
        )

)

内容的提问来源于stack exchange,提问作者chortley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:47:37