JSON解码数组用映射替换键名时$map[$key]返回null的问题
问题分析与解决方案
核心问题
- 键名大小写不匹配:原数组的键为全小写(如
projectid),但映射数组的键是驼峰格式(如projectId),导致isset($map[$key])始终返回false,无法匹配到映射关系。 - 递归调用参数缺失:原函数递归处理子数组时未传递
$map参数,多维数组无法被正确处理。 - 逻辑冗余:
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);
关键细节说明
- 统一键名大小写:使用
array_change_key_case($map, CASE_LOWER)将映射数组的键转为全小写,直接匹配原数组的键格式,解决大小写不匹配问题。 - 引用传递优化:函数参数
&$array和循环中的&$value使用引用传递,避免数组复制,提升处理大数组的效率。 - 递归逻辑修正:递归处理子数组时传递
$map参数,确保多维数组的键名也能被正确替换。
内容的提问来源于stack exchange,提问作者startingout
相关产品推荐
相关产品推荐

