您只需设置新密钥并删除旧密钥即可"change" the key of an array element:
$array[$newKey] = $array[$oldKey];
unset($array[$oldKey]);
但是这会将键移动到数组的末尾。
是否有一些优雅的方法可以在不改变顺序的情况下更改密钥?
(PS:这个问题仅仅是出于概念上的兴趣,不是因为我需要它。)
答案 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);