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
相关产品推荐
相关产品推荐

