php 将数组中的所有键从snake_case改为PascalCase

7nbnzgx9  于 2023-04-19  发布在  PHP
关注(0)|答案(2)|浏览(148)

我想替换数组中的所有索引键,但我只需要用像array_map()这样的函数(而不是用foreach)来做,这就是为什么对我来说有点困难。
实际数组:

$array = [
    'mc_gross' => 10.17,
    'protection_eligibility' => 'Eligible',
    'address_status' => 'unconfirmed',
    'payer_id' => 'STTAC7UV2CVJ4'
];

预期数组:

$array = [
    'McGross' => 10.17,
    'ProtectionEligibility' => 'Eligible',
    'AddressStatus' => 'unconfirmed',
    'PayerId' => 'STTAC7UV2CVJ4'
];

我已经有一个函数将第一个字母大写并删除所有'_':

str_replace(
    "_",
    "",
    implode(
        '_',
        array_map(
            'ucfirst',
            explode(
                '_',
                ucwords(strtolower($key))
            )
        )
    )
);

我尝试过使用array_walk(),但是这个函数不能替换索引键,只能替换值:

array_walk($array, function ($value, &$key) {
    $key = str_replace("_", "", implode('_', array_map('ucfirst', explode('_', ucwords(strtolower($key))))));
});
v64noz0r

v64noz0r1#

如果不想使用foreach,可以使用array_keysarray_maparray_combine的组合来实现。

$array = array(
    'mc_gross' => 10.17,
    'protection_eligibility' => 'Eligible',
    'address_status' => 'unconfirmed',
    'payer_id' => 'STTAC7UV2CVJ4'
);

//Get keys
$keys = array_keys($array);

//Format keys
function map($key){
    return str_replace(' ', '', ucwords(str_replace('_', ' ', $key)));
}

//Map keys to format function
$keys = array_map('map', $keys);

//Use array_combine to map formatted keys to array values
$array = array_combine($keys,$array);

var_dump($array);

这应该输出如下内容:

array(4){
    ["McGross"]=>float(10.17)
    ["ProtectionEligibility"]=>string(8) "Eligible"
    ["AddressStatus"]=>string(11) "unconfirmed"
    ["PayerId"]=>string(13) "STTAC7UV2CVJ4"
}

相关文档:
http://php.net/manual/en/function.array-keys.php
http://php.net/manual/en/function.array-map.php
http://php.net/manual/en/function.array-combine.php

编辑

正如@Wrikken所指出的,array_values的使用是多余的,不需要的。谢谢你的指针!

w46czmvw

w46czmvw2#

不建议替换原始数组中的键,因为在处理过程中有意外覆盖元素的风险。应使用旧值和新键生成新数组。
比@MSost的答案更直接的是,使用array_reduce()函数式地迭代数组,并将键修改的元素与结果数组合并。
指示ucwords()将下划线视为断字。
代码:(Demo

var_export(
    array_reduce(
        array_keys($array),
        fn($result, $k) => $result + [str_replace('_', '', ucwords($k, '_')) => $array[$k]],
        []
    )
);

经典循环的等价形式如下所示:(Demo

$result = [];
foreach ($array as $key => $value) {
    $result[str_replace('_', '', ucwords($key, '_'))] = $value;
}
var_export($result);

相关问题