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

JSON解码数组用映射替换键名时$map[$key]返回null的问题

问题分析与解决方案

核心问题

  1. 键名大小写不匹配:原数组的键为全小写(如projectid),但映射数组的键是驼峰格式(如projectId),导致isset($map[$key])始终返回false,无法匹配到映射关系。
  2. 递归调用参数缺失:原函数递归处理子数组时未传递$map参数,多维数组无法被正确处理。
  3. 逻辑冗余:elseif (!is_array($value))分支无必要,应优先处理键名替换,再递归处理子数组。

解决方案代码

// 原映射数组
$map = [
    'projectId' =>'project_id',
    'projectName' => 'project_name',
    'purchaseOrderId' => 'purchase_order_id',
    'readOnly' => 'read_only',
    'readOnlyDescription' => 'read_only_description',
    'receivedDate' => 'received_date',
    'shipFromAddressId' => 'ship_from_address_id',
    'shippingInstructions' => 'shipping_instructions',
    'shipToAddressId' => 'ship_to_address_id',
    'shortName' => 'short_name',
    'specialCode' => 'special_code'
];

// 将映射数组的键转为全小写,匹配原数组的键格式
$lowerMap = array_change_key_case($map, CASE_LOWER);

// 原JSON解码后的数组(含多维数组示例)
$array = [
    'projectid' => '140d0b2b-8538-4353-a90a-bc9d5979b03c',
    'projectname' => '230041 Test Project',
    'createdate' => '2023-04-25T10:55:55.146188',
    'modifieddate' => '2023-12-15T08:38:50.1736124-05:00',
    'biddate' => '2023-04-25T10:55:55.1599415',
    'gooduntildate' => '2023-05-25T10:55:55.1599415',
    'jobref' => '230041',
    'projectaddressid' => '66f2503e-55af-4c33-87ac-5f45770ac0e4',
    'freightselloverride' => 0.0,
    'freighttaxable' => true,
    'installationtaxable' => false,
    'subArray' => [
        'readonly' => true,
        'receiveddate' => '2023-01-01'
    ]
];

function array_rename(&$array, $map) {
    foreach ($array as $key => &$value) {
        // 递归处理子数组
        if (is_array($value)) {
            array_rename($value, $map);
        }
        
        // 匹配映射关系,替换键名
        if (isset($map[$key])) {
            $array[$map[$key]] = $value;
            unset($array[$key]);
        }
    }
    unset($value); // 释放引用,避免后续意外修改
}

// 执行键名替换
array_rename($array, $lowerMap);

// 输出结果
print_r($array);

关键细节说明

  1. 统一键名大小写:使用array_change_key_case($map, CASE_LOWER)将映射数组的键转为全小写,直接匹配原数组的键格式,解决大小写不匹配问题。
  2. 引用传递优化:函数参数&$array和循环中的&$value使用引用传递,避免数组复制,提升处理大数组的效率。
  3. 递归逻辑修正:递归处理子数组时传递$map参数,确保多维数组的键名也能被正确替换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:12:02