Ищем эквивалент array_map для работы с ключами в ассоциативных массивах

Предположим, у меня есть ассоциативный массив:

    $array = array(
      "key1" => "value",
      "key2" => "value2");

И я хотел сделать клавиши заглавными. Как бы я сделал это в обобщенном виде (то есть я мог бы применить определяемую пользователем функцию для применения к именам клавиш)?


person RedBullet    schedule 25.07.2013    source источник


Ответы (4)


Вы можете использовать функцию php array_change_key_case

<?php
$input_array = array("FirSt" => 1, "SecOnd" => 4);
print_r(array_change_key_case($input_array, CASE_UPPER));
?>
person Siddhartha Gupta    schedule 25.07.2013
comment
Ах, не знал об этом конкретном, но на самом деле вопрос был больше об обобщенном механизме, таком как array_map, где я мог бы применить определяемую пользователем функцию к клавишам. - person RedBullet; 26.07.2013
comment
Что ж, с array_map вы не можете модулировать ключи в соответствии с вашими требованиями. Более подробное объяснение можно найти здесь, stackoverflow.com/a/3432266/2266525 - person Siddhartha Gupta; 26.07.2013

Удивительно, но есть array_change_key_case функция.

person André Dion    schedule 25.07.2013
comment
Так странно. Никогда об этом не слышал. - person christopher; 25.07.2013

Помимо приведенных выше ответов - следующий код также делает свое дело. Преимущество в том, что вы можете использовать это для любой операции с keys, кроме только создания ключей uppercase.

<?php
   $arr = array(
      "key1" => "value",
      "key2" => "value2"
   );

  echo "<pre>";print_r($arr);echo "</pre>";

  $arra = array_combine(
        array_map(function($k){ 
           return strtoupper($k); 
        }, array_keys($arr)
    ), $arr);

  echo "<pre>";print_r($arra);echo "</pre>";

Этот код выводится как:

Array
(
    [key1] => value
    [key2] => value2
)
Array
(
    [KEY1] => value
    [KEY2] => value2
)

Так что это всего лишь альтернатива и более общее решение для изменения keys массива.

Спасибо.

person Himel Nag Rana    schedule 30.04.2015

Вы можете использовать цикл foreach:

$newArray = array();
foreach ($array as $k => $v) {
    $newArray[strtoupper($k)] = $v;
}
person jh314    schedule 25.07.2013
comment
Таким образом, старый ключ все еще существует в массиве. Итак, вы также должны отключить старую, используя unset ($ array [$ k]); - person Benz; 25.07.2013