更改数组键而不更改顺序

时间:2012-01-16 17:38:25

标签: php arrays

您只需设置新密钥并删除旧密钥即可"change" the key of an array element

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

但是这会将键移动到数组的末尾。

是否有一些优雅的方法可以在不改变顺序的情况下更改密钥?

(PS:这个问题仅仅是出于概念上的兴趣,不是因为我需要它。)

8 个答案:

答案 0 :(得分:27)

经过测试和工作:)

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

答案 1 :(得分:10)

这样的事情也可行:

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

答案 2 :(得分:6)

一种方法是简单地使用foreach迭代数组并将其复制到新数组,在迭代时有条件地更改键,例如if $ key ==='foo'然后不要使用foo但是吧:

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再次返回数组。这不是特别优雅,但可能容易出错,特别是当你不只有标量或多维数组时。

第三种方式 - 我最喜欢的 - 就是你在C中编写array_key_rename并为PHP核心提出它;)

答案 3 :(得分:1)

在继续操作之前检查密钥是否存在... 否则,如果新密钥已经存在,则结果可能是灾难性的……如果不存在要更换的密钥,则结果可能是不必要的处理时间/内存消耗。

function array_rename_key( array $array, $old_key, $new_key ) {
    // if $new_key already exists, or if $old_key doesn't exists
    if ( array_key_exists( $new_key, $array ) || ! array_key_exists( $old_key, $array ) ) {
        return $array;
    }

    $new_array = [];
    foreach ( $array as $k => $v ) {
        $new_array[ $k === $old_key ? $new_key : $k ] = $v;
    }

    return $new_array;
}

答案 4 :(得分:0)

做双翻!至少这是我能想到的全部:

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

答案 5 :(得分:0)

我们正在使用此函数来更改数组中保持顺序的多个数组键:

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",...)

此解决方案基于Kristian。

答案 6 :(得分:0)

如果可能的话,也可以在创建时将要更改的键放在数组的末尾:

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

答案 7 :(得分:-2)

您可以使用array_combine。它合并了一个数组用于键,另一个用于值...

例如:

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