Change all keys in an array from snake_case to PascalCase
Asked Answered
N

2

6

I want to replace all index keys in a array but I need to do it only with a function like array_map() (not with a foreach) and that's why it's a little hard for me.

Actual array:

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

Expected array :

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

I have already a function to put the first letter in uppercase and remove all '_' :

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

I have tried with array_walk(), but this function can't replace index key, only value:

array_walk($array, function ($value, &$key) {
    $key = str_replace("_", "", implode('_', array_map('ucfirst', explode('_', ucwords(strtolower($key))))));
});
Noon answered 19/11, 2014 at 23:52 Comment(4)
Is there a particular reason you don't want to use foreach to solve this?Stickney
@Stickney Not really, i just want to use an alternative to the foreach function.Noon
^ I agree with DaOgre. foreach-es are simple, readable, maintainable, and probably just as fast or faster for this as anything you can come up with. But you, you could use array_combine(array_map($yourfunc,array_keys($array)),$array);Banas
Related: Convert array keys from underscore_case to camelCase recursivelyCohdwell
A
10

If you don't want to use a foreach, you can use a combination of array_keys, array_map, and array_combine to achieve this.

$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);

This should output something like:

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

Relative docs:

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

EDIT

As @Wrikken pointed out, the use of array_values is redundant and not needed. Thanks for the pointer!

Ameba answered 20/11, 2014 at 0:11 Comment(1)
Awesome ! Thanks a lot. I have rewritten your code in one line : $array = array_combine(array_map(function ($key){ return str_replace("_", "", implode('_', array_map('ucfirst', explode('_', ucwords(strtolower($key)))))); }, array_keys($array)), array_values($array));Noon
C
1

It is inadvisable to replace the keys in the original array due to the risk of accidentally overwriting elements while processing. A new array should be generated with the old values and the new keys.

More directly than @MSost's answer, use array_reduce() to functionally iterate the array and unite key-modified elements with the result array.

Instruct ucwords() to treat underscores as word breaks.

Code: (Demo)

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

The equivalent with a classic loop looks like this: (Demo)

$result = [];
foreach ($array as $key => $value) {
    $result[str_replace('_', '', ucwords($key, '_'))] = $value;
}
var_export($result);
Cohdwell answered 9/3, 2023 at 15:18 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.