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

问题描述 投票:0回答:12

我有一个如下所示的数组

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

我知道这可以更简单。

php arrays multidimensional-array array-key
12个回答
30
投票
array_combine(array_merge($old, $keyReplaceInfoz), $old)

我认为这看起来比你提出的更容易。


6
投票
array_combine(
    ['newKey1', 'newKey2', 'newKey3'],
    array_values(['oldKey1' => 1, 'oldKey2' => 2, 'oldKey3' => 3])
);

只要您具有相同数量的值和相同的顺序,这应该可以解决问题。


4
投票

IMO 使用 array_combine、array_merge、甚至 array_intersect_key 都太过分了。 原始代码足够好,而且速度非常快。


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

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

1
投票

这个问题很老了,但由于它首先出现在谷歌上,我想我应该添加解决方案。

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

结果:

    大批
    (
       [FOO] => 1
       [巴兹] => 2
       [酒吧] => 3
    )

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

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' ) )

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

演示

受到以下片段的启发。


0
投票

这使用了@Summoner示例,但记住了@Leigh提示

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

0
投票

在阅读了互联网上的所有答案后,我想出了一个稍微不同的选项,不需要一对一映射并保留原始数组中未替换的键:

<?php
$array = [5=>'test5', 'AA'=>'testAA', 15=>'test15'];
$replace_keys = [0=>'key0', 5=>'key5', 'AA'=>'keyAA'];
        
$result = array_map(function($key, $value) use ($replace_keys) {  
    $key = $replace_keys[$key] ?? $key;
    return "{$key} => {$value}";  
}, array_keys($array), $array);
        
var_dump($result);

输出:

array(3) {
  [0]=>
  string(13) "key5 => test5"
  [1]=>
  string(15) "keyAA => testAA"
  [2]=>
  string(12) "15 => test15"
}

-1
投票
    <?php
$new = array(); 

foreach ($old as $key => $value)
{
     $new[$keyReplaceInfoz][$key] = $value;

}
?>
© www.soinside.com 2019 - 2024. All rights reserved.