我有一个如下所示的数组
$old = array(
'a' => 'blah',
'b' => 'key',
'c' => 'amazing',
'd' => array(
0 => 'want to replace',
1 => 'yes I want to'
)
);
我有另一个数组,其中包含可以替换密钥信息的密钥。
$keyReplaceInfoz = array('a' => 'newA', 'b' => 'newB', 'c' => 'newC', 'd' => 'newD');
我需要将数组$old
的所有键替换为数组$keyReplaceInfo
中的相应值。
输出应该是这样的
$old = array(
'newA' => 'blah',
'newB' => 'key',
'newC' => 'amazing',
'newD' => array(
0 => 'want to replace',
1 => 'yes I want to'
)
);
我必须手动完成,如下所示。我期待更好的选择。任何人都可以提出更好的方法来实现这个目标吗?
$new = array();
foreach ($old as $key => $value)
{
$new[$keyReplaceInfoz[$key]] = $value;
}
我知道这可以更简单。
答案 0 :(得分:16)
array_combine(array_merge($old, $keyReplaceInfoz), $old)
我认为这看起来比你提出的要容易。
答案 1 :(得分:3)
IMO使用array_combine,array_merge甚至array_intersect_key都是过分的。 原始代码足够好,而且非常快。
答案 2 :(得分:2)
适应@ shawn-k解决方案,这里使用array_walk更清洁代码,它只会替换所需的键,当然你可以根据自己的方便进行修改
array_walk($old, function($value,$key)use ($keyReplaceInfoz,&$old){
$newkey = array_key_exists($key,$keyReplaceInfoz)?$keyReplaceInfoz[$key]:false;
if($newkey!==false){$old[$newkey] = $value;unset($old[$key]);
}
});
print_r($old);
答案 3 :(得分:1)
我刚刚在我自己的应用程序中解决了同样的问题,但对于我的应用程序,$ keyReplaceInfoz就像白名单一样 - 如果找不到密钥,整个元素将从生成的数组中删除,而匹配的白名单键被转换为新的价值观。
我想你可以通过巧妙地使用array_map(http://php.net/manual/en/function.array-map.php)来应用相同的算法,但也可以使用更少的总代码,这可能是另一个慷慨的读者。
function filterOldToAllowedNew($key_to_test){
return isset($keyReplaceInfoz[$key_to_test])?$keyReplaceInfoz[$key_to_test]:false;
}
$newArray = array();
foreach($old as $key => $value){
$newkey = filterOldToAllowedNew($key);
if($newkey){
$newArray[$newkey] = $value;
}
}
print_r($newArray);
答案 4 :(得分:0)
这是我为同一主题实施的解决方案:
/**
* Replace keys of given array by values of $keys
* $keys format is [$oldKey=>$newKey]
*
* With $filter==true, will remove elements with key not in $keys
*
* @param array $array
* @param array $keys
* @param boolean $filter
*
* @return $array
*/
function array_replace_keys(array $array,array $keys,$filter=false)
{
$newArray=[];
foreach($array as $key=>$value)
{
if(isset($keys[$key]))
{
$newArray[$keys[$key]]=$value;
}
elseif(!$filter)
{
$newArray[$key]=$value;
}
}
return $newArray;
}
答案 5 :(得分:0)
array_combine(
['newKey1', 'newKey2', 'newKey3'],
array_values(['oldKey1' => 1, 'oldKey2' => 2, 'oldKey3' => 3])
);
只要您具有相同数量的值和相同的顺序,就可以解决问题。
答案 6 :(得分:0)
这个问题很旧,但是因为它首先出现在Google上,所以我想我应该添加解决方案。
// Subject
$old = array('foo' => 1, 'baz' => 2, 'bar' => 3));
// Translations
$tr = array('foo'=>'FOO', 'bar'=>'BAR');
// Get result
$new = array_combine(preg_replace(array_map(function($s){return "/^$s$/";},
array_keys($tr)),$tr, array_keys($old)), $old);
// Output
print_r($new);
结果:
Array ( [FOO] => 1 [baz] => 2 [BAR] => 3 )
答案 7 :(得分:0)
此方法不管阵列顺序和阵列数如何。输出顺序和值将基于replaceKey。
$replaceKey = array('a' => 'newA', 'b' => 'newB', 'c' => 'newC', 'd' => 'newD', 'e' => 'newE','f'=>'newF');
$array = array(
'a' => 'blah',
'd' => array(
0 => 'want to replace',
1 => 'yes I want to'
),
'noKey'=>'RESIDUAL',
'c' => 'amazing',
'b' => 'key',
);
$filterKey = array_intersect_key($replaceKey,$array);
$filterarray = array_intersect_key(array_merge($filterKey,$array),$filterKey);
$replaced = array_combine($filterKey,$filterarray);
//output
var_export($replaced);
//array ( 'newA' => 'blah', 'newB' => 'key', 'newC' => 'amazing', 'newD' => array ( 0 => 'want to replace', 1 => 'yes I want to' ) )
答案 8 :(得分:0)
如果您正在寻找用于多维数组的递归解决方案,请查看以下方法。它将替换所有请求的密钥,并保留所有其他密钥。
/**
* Given an array and a set of `old => new` keys,
* will recursively replace all array keys that
* are old with their corresponding new value.
*
* @param mixed $array
* @param array $old_to_new_keys
*
* @return array
*/
function array_replace_keys($array, array $old_to_new_keys)
{
if(!is_array($array)){
return $array;
}
$temp_array = [];
$ak = array_keys($old_to_new_keys);
$av = array_values($old_to_new_keys);
foreach($array as $key => $value){
if(array_search($key, $ak, true) !== false){
$key = $av[array_search($key, $ak)];
}
if(is_array($value)){
$value = array_replace_keys($value, $old_to_new_keys);
}
$temp_array[$key] = $value;
}
return $temp_array;
}
使用 OP 的示例数组:
$old = array(
'a' => 'blah',
'b' => 'key',
'c' => 'amazing',
'd' => array(
0 => 'want to replace',
1 => 'yes I want to'
)
);
$replace = ["a" => "AA", 1 => 11];
var_export(array_replace_keys($old, $replace));
给出以下输出:
array (
'AA' => 'blah',
'b' => 'key',
'c' => 'amazing',
'd' =>
array (
0 => 'want to replace',
11 => 'yes I want to',
),
)
灵感来自following snippet。
答案 9 :(得分:0)
这里使用了 @Summoner 的 example,但记住了 @Leigh 的 hint:
$start = microtime();
$array = [ "a" => 1, "b" => 2, "c" => 3 ];
function array_replace_key($array, $oldKey, $newKey) {
$keys = array_keys($array);
$idx = array_search($oldKey, $keys);
array_splice($keys, $idx, 1, $newKey);
return array_combine($keys, array_values($array));
}
print_r(array_replace_key($array, "b", "z"));
答案 10 :(得分:-1)
<?php
$new = array();
foreach ($old as $key => $value)
{
$new[$keyReplaceInfoz][$key] = $value;
}
?>
答案 11 :(得分:-1)
<?php
$old = array(
'a' => 'blah',
'b' => 'key',
'c' => 'amazing',
'd' => array(
0 => 'want to replace',
1 => 'yes I want to'
)
);
$keyReplaceInfoz = array('a' => 'newA', 'b' => 'newB', 'c' => 'newC', 'd' => 'newD');
$new = array();
foreach ($old as $key => $value)
{
$newvalue = $keyReplaceInfoz[$key];
$new[$key] = $newvalue;
}
print_r($new);
?>