假设我有这个关联数组:
$fruits = array(
'red' => 'strawberry',
'blue' => 'banana',
'green' => 'apple',
);
我想将键
blue
更改为yellow
。请注意,我想更改key,而不是值。我可以这样做:
$fruits['yellow'] = $fruits['blue'];
unset($fruits['blue']);
但这会导致
'yellow' => 'banana'
位于数组的end。如果我需要保持数组的顺序,那么'yellow' => 'banana'
与之前的'blue' => 'banana'
处于相同的位置,我该怎么做?
当然,我可以重建整个数组,添加所有键/值对,然后插入
yellow
而不是 blue
键,但这似乎是一种相当缓慢的方法。
是否有更智能/更高效(最好是 PHP 原生)的方法来就地执行此操作?
以下示例主要取自关联数组的array_splice()
$newArray = array_slice($fruits, 0, $offset, true) +
array('yellow' => 'banana') +
array_slice($fruits, $offset, NULL, true);
print_r($newArray);
如果我们知道“蓝色”键所在位置的偏移量,我们可以在其位置添加一个新的黄色键。
因此,在您的情况下,偏移量为 1,因为蓝色是数组中的第二个键。
一种解决方案是使用 array_keys 获取键,应用一个函数根据需要更改它们,然后使用 array_combine 将新键与值组合在一起
$array = array_combine(array_map('replace_key', array_keys($fruits)), $fruits);
function replace_key($key){
if($key=="blue") return "yellow";
return $key;
}
另一种解决方案是使用
array_walk
$result = array();
array_walk($fruits, function (&$value,$key) use (&$result) {
if($key=="blue") $key="yellow";
$result[ $key ] = $value;
});
print_r($result);
另一种方法(可能更快)是使用
foreach
循环并重建数组。如果您想要通用解决方案,只需根据此代码编写一个简单的函数即可:
$temp_array=array();
foreach($fruits as $key=>$value){
if($key=="blue") $key="yellow";
$temp_array[$key]=$value;
}
$fruits=$temp_array;
if (!empty($fruits) && array_key_exists("blue",$fruits))
{
$keepValue = $array['blue'];
$newKey = 'yellow';
unset($item['field_64c782fc4c55d']);
$item[$newKey]=$keepValue;
}
最快的方法:
foreach ($fruits as $key => $value){
if ($key === "blue") {
$fruits["yellow"] = $value;
unset($fruits[$key]);
}
}