您可以通过设置新键并删除旧键来简单地更改数组元素的键:(在PHP中如何更改数组元素的键)
$array[$newKey] = $array[$oldKey];
unset($array[$oldKey]);
但这样会将键移动到数组的末尾。
是否有一些优雅的方法可以在不改变顺序的情况下更改键?
(PS:这个问题只是出于概念上的兴趣,不是因为我在其他地方需要它。)
您可以通过设置新键并删除旧键来简单地更改数组元素的键:(在PHP中如何更改数组元素的键)
$array[$newKey] = $array[$oldKey];
unset($array[$oldKey]);
但这样会将键移动到数组的末尾。
是否有一些优雅的方法可以在不改变顺序的情况下更改键?
(PS:这个问题只是出于概念上的兴趣,不是因为我在其他地方需要它。)
测试并且可行 :)
function replace_key($array, $old_key, $new_key) {
$keys = array_keys($array);
if (false === $index = array_search($old_key, $keys, true)) {
throw new Exception(sprintf('Key "%s" does not exist', $old_key));
}
$keys[$index] = $new_key;
return array_combine($keys, array_values($array));
}
$array = [ 'a' => '1', 'b' => '2', 'c' => '3' ];
$new_array = replace_key($array, 'b', 'e');
$old_key
不在数组中的情况添加错误处理程序。 - Felix Kling可能也可以试试这种方式:
$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
)
"EN":
(引号字符串后跟冒号)非常罕见。 - anubhava一种方法是使用foreach循环遍历数组并将其复制到新数组中,在迭代时有条件地更改键,例如,如果$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;
}
str_replace
替换序列化的键,然后再将其反序列化回数组。虽然这并不是特别优雅的方法,并且可能出现错误,特别是当你不仅有标量值或多维数组时。array_key_rename
函数,并将其提议加入 PHP 核心 ;)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;
}
做一个双重翻转!至少这是我能想到的:
$array=("foo"=>"bar","asdf"=>"fdsa");
$array=array_flip($array);
$array["bar"]=>'newkey';
$array=array_flip($array);
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 的方案。
$array=array('key1'=>'value1','key2'=>'value2','keytochange'=>'value');
$x=$array['keytochange'];
unset($array['keytochange']);
$array['newkey']=$x;
你可以使用 array_combine函数。它可以将一个数组的键与另一个数组的值进行合并...
例如:
$original_array =('foo'=>'bar','asdf'=>'fdsa');
$new_keys = array('abc', 'def');
$new_array = array_combine($new_keys, $original_array);
$array[$oldKey]
只会返回键$oldKey
对应的值。 - NikiCunset()
如何从数组中删除元素?PHP又如何知道应该从哪个数组中删除值5? - Felix Dombek