
本文介绍一种高效、可复用的递归方法,用于将多维 PHP 数组中任意层级的指定键名(如 group_id)统一重命名为目标键名(如 id),支持批量映射,适用于 JSON 解析后与数据库字段对齐的场景。
本文介绍一种高效、可复用的递归方法,用于将多维 php 数组中任意层级的指定键名(如 `group_id`)统一重命名为目标键名(如 `id`),支持批量映射,适用于 json 解析后与数据库字段对齐的场景。
在实际开发中,常需将外部接口返回的 JSON 数据(经 json_decode($json, true) 转为关联数组)写入本地数据库。但字段命名往往不一致:例如 API 使用 group_id,而数据库表设计为 id。若数组结构嵌套较深(如含用户列表、分组信息、子项配置等),手动遍历修改既易错又不可维护。
以下是一个健壮、无副作用的递归重映射函数,支持单层及任意深度的多维数组,并允许多键批量映射:
/**
* 递归重映射数组键名
* @param array $array 待处理的源数组(必须为关联数组)
* @param array $mapping 键名映射规则,格式为 ['原键名' => '新键名']
* @return array 重映射后的新数组(原始数组不受影响)
*/
public function remapArray(array $array, array $mapping): array
{
$newArray = [];
foreach ($array as $key => $value) {
if (is_array($value)) {
// 递归处理子数组,保持嵌套结构
$newArray[$key] = $this->remapArray($value, $mapping);
} else {
// 检查当前键是否需要重命名
if (isset($mapping[$key])) {
$newArray[$mapping[$key]] = $value; // 执行键名替换
} else {
$newArray[$key] = $value; // 保留原键
}
}
}
return $newArray;
}✅ 使用示例:
假设你收到如下 JSON 数据并解码为数组:
$json = '{"groups":[{"group_id":101,"name":"Admins","members":[{"user_id":201,"role":"lead"}]}]}';
$data = json_decode($json, true);
// 映射规则:group_id→id,user_id→id
$remapped = $this->remapArray($data, [
'group_id' => 'id',
'user_id' => 'id'
]);
// 输出结果中,所有 group_id 和 user_id 均已替换为 id
print_r($remapped);
// → ['groups' => [['id'=>101, 'name'=>'Admins', 'members'=>[['id'=>201, 'role'=>'lead']]]]]⚠️ 注意事项:
- 该函数不修改原数组,始终返回全新数组,符合函数式编程原则,避免意外副作用;
-
isset($mapping[$key])比!empty()更安全,可正确处理值为0、false或空字符串的合法数据; - 若存在键冲突(如多个原键映射到同一新键),后出现的值会覆盖先出现的值——建议确保
$mapping中的 value 唯一; - 不支持重映射“键路径”(如仅重映射
groups[].group_id),如需路径级控制,应结合array_walk_recursive+ 引用或采用更高级的树遍历策略。
此方案简洁、可读性强、易于单元测试,且天然兼容 PSR-12 编码规范,可直接集成至 DAO 层或数据转换服务中,是处理 API-to-DB 字段适配的推荐实践。
立即学习“PHP免费学习笔记(深入)”;



















