递归地将所有键从camelCase转换为snake_case

问题描述 投票:0回答:1

我的数组看起来像这样(有多个子数组)

[
    'reportId' => '20210623-da1ece3f'
    'creationDate' => '2021-06-23 19:50:15'
    'dueDate' => '2021-06-24 19:50:15'
    'data' => [
        'vehicleDetails' => [
            'chassisNumber' => 'xxxxx-xxxxxx'
            'make' => 'Honda'
            'model' => 'City'
            'manufactureDate' => '2000'
            'body' => 'xxx-xxxxx'
            'engine' => 'xxx-xxx'
            'drive' => 'FF'
            'transmission' => 'MT'
        ]
]

我正在尝试将所有键从

chassisNumber
重命名为
chassis_number
。这就是我到目前为止所做的

function changeArrayKeys($array)
{
    if(!is_array($array)) return $array;
    $tempArray = array();
    foreach ($array as $key=>$value){
        if(is_array($value)){
            $value = changeArrayKeys($value);
        }else{
            $key  = strtolower(trim(preg_replace('/([A-Z])/', '_$1', $key)));
        }
        $tempArray[$key]=$value;
    }
    return $tempArray;
}

print_r(changeArrayKeys($data)); die;

这段代码是有效的。它只是不取代子键。就像这里

'data' => [
        'vehicleDetails' => [ ]
]

但在内部

vehicleDetails[]
它可以正确更换。知道我在这里缺少什么吗?或者有没有更好、更有效的方法来代替递归?

php arrays recursion camelcasing snakecasing
1个回答
2
投票

这对我来说看起来很明显:

        if(is_array($value)){
            $value = changeArrayKeys($value);
        }else{
            $key  = strtolower(trim(preg_replace('/([A-Z])/', '_$1', $key)));
        }

如果

$value
是一个数组,则执行递归调用,但不会以任何方式更改该嵌套数组的键。它可以帮助将
$key
操作移出
else
分支

© www.soinside.com 2019 - 2024. All rights reserved.