Подтвердить что ты не робот

Изменение ключа массива без изменения порядка

Вы можете "изменить" ключ элемента массива, просто установив новый ключ и удалив старый:

$array[$newKey] = $array[$oldKey];
unset($array[$oldKey]);

Но это переместит ключ в конец массива.

Есть ли элегантный способ изменить ключ без изменения порядка?

(PS: Этот вопрос просто вне концептуального интереса, а не потому, что он мне нужен где угодно.)

4b9b3361

Ответ 1

Протестировано и работает:)

$array = array( "a" => "1", "b" => "2", "c" => "3" );

function replace_key($array, $old_key, $new_key) {
    $keys = array_keys($array);
    if (false === $index = array_search($old_key, $keys)) {
        throw new Exception(sprintf('Key "%s" does not exit', $old_key));
    }
    $keys[$index] = $new_key;
    return array_combine($keys, array_values($array));
}

$new_array = replace_key($array, "b", "e");

Ответ 2

Возможно, что-то вроде этого:

$langs = array("EN" => "English", 
        "ZH" => "Chinese", 
        "DA" => "Danish",
        "NL" => "Dutch", 
        "FI" => "Finnish", 
        "FR" => "French",
        "DE" => "German");
$json = str_replace('"EN":', '"en":', json_encode($langs));
print_r(json_decode($json, true));

ВЫВОД:

Array
(
    [en] => English
    [ZH] => Chinese
    [DA] => Danish
    [NL] => Dutch
    [FI] => Finnish
    [FR] => French
    [DE] => German
)

Ответ 3

Один из способов - просто использовать foreach, итерацию по массиву и копирование его в новый массив, изменение ключа условно во время итерации, например. if $key === 'foo', тогда не используйте foo, но bar:

function array_key_rename($array, $oldKey, $newKey) 
{
    $newArray = [];
    foreach ($array as $key => $value) {
        $newArray[$key === $oldKey ? $newKey : $key] = $value;
    }
    return $newArray;
}

Другим способом будет serialize массив, str_replace сериализованный ключ, а затем unserialize снова вернуться в массив. Это не особенно элегантная, хотя и вероятная склонность к ошибкам, особенно если у вас нет только скаляров или многомерных массивов.

Третий способ - мой любимый - вы пишете array_key_rename в C и предлагаете его для ядра PHP;)

Ответ 4

Сделайте двойной щелчок! По крайней мере, это все, о чем я могу думать:

$array=("foo"=>"bar","asdf"=>"fdsa");
$array=array_flip($array);
$array["bar"]=>'newkey';
$array=array_flip($array);

Ответ 5

Мы используем эту функцию для изменения нескольких ключей массива в массиве, сохраняя порядок:

function replace_keys($array, $keys_map) {
    $keys = array_keys($array);
    foreach($keys_map as $old_key=>$new_key){
        if (false === $index = array_search($old_key, $keys)) {
            continue;
        }
        $keys[$index] = $new_key;
    }
    return array_combine($keys, array_values($array));
}

Вы можете передать массив как $keys_map, например:

$keys_map=array("old_key_1"=>"new_key_1", "old_key_2"=>"new_key_2",...)

Это решение основано на Кристианском.

Ответ 6

Если возможно, можно также поставить ключ для изменения в конце массива в момент создания:

$array=array('key1'=>'value1','key2'=>'value2','keytochange'=>'value');
$x=$array['keytochange'];
unset($array['keytochange']);
$array['newkey']=$x;

Ответ 7

Вы можете использовать array_combine. Он объединяет массив для ключей и другой для значений...

Например:

$original_array =('foo'=>'bar','asdf'=>'fdsa');
$new_keys       = array('abc', 'def');
$new_array      = array_combine($new_keys, $original_array);