我想替换数组中的所有索引键,但我只需要使用像 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))))));
});
如果你不想使用foreach
,你可以使用array_keys
、array_map
和array_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
是多余的,不需要。感谢您的指点!
不建议替换原始数组中的键,因为在处理时存在意外覆盖元素的风险。 应使用旧值和新键生成一个新数组。
比@MSost的答案更直接的是,使用 array_reduce()
在功能上迭代数组并将键修改元素与结果数组联合起来。
指示ucwords()
将下划线视为分词符。
代码:(演示)
var_export(
array_reduce(
array_keys($array),
fn($result, $k) => $result + [str_replace('_', '', ucwords($k, '_')) => $array[$k]],
[]
)
);
<小时 />经典循环的等效项如下所示:(演示)
$result = [];
foreach ($array as $key => $value) {
$result[str_replace('_', '', ucwords($key, '_'))] = $value;
}
var_export($result);