2014-11-19 7 views
2

Я хочу заменить все индексные ключи в массиве, но мне нужно сделать это только с помощью функции array_map (не с foreach), и поэтому для меня это немного сложно.Изменение всех ключей в массиве

Actual массив:

$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, но эта функция не может r eplace index key, only value ...:

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

Заранее за вашу помощь.

+1

Возможный дубликат [PHP Change Array Keys] (http://stackoverflow.com/questions/308703/php-change-array-keys) – slapyo

+2

Есть ли конкретная причина, по которой вы не хотите использовать foreach для решения этой проблемы? ? – DaOgre

+0

@DaOgre Не совсем, я просто хочу использовать альтернативу функции foreach. – ZoRo

ответ

5

Если вы не хотите использовать 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

EDIT

Как @Wrikken отмечалось, использование array_values является излишним и не требуется. Спасибо за указатель!

+1

Ха, думал то же самое (хотя я предпочитаю 'foreach'). Быстрое примечание: 'array_values' не требуется. – Wrikken

+0

Удивительный! Большое спасибо. Я переписал свой код в одну строку: '$ массив = array_combine (array_map (функция ($ ключ) { \t \t \t возврата str_replace ("_", "", обрушится ('_', array_map ('ucfirst', explode ('_', ucwords (strtolower ($ key)))))) \t \t}, array_keys ($ array)), array_values ​​($ array)); ' – ZoRo

+0

Если это более читаемо для вас, вы;) Рад, что я мог бы помочь –

Смежные вопросы