phparrayskeypascalcasingsnakecasing

Change all keys in an array from snake_case to PascalCase


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

Solution

  • 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!