用给定的相应键替换数组键

时间:2012-07-30 13:53:41

标签: php arrays multidimensional-array array-key

我有一个如下所示的数组

$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;
}

我知道这可以更简单。

12 个答案:

答案 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',
  ),
)

DEMO

灵感来自following snippet

答案 9 :(得分:0)

这里使用了 @Summonerexample,但记住了 @Leighhint

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

?>