replace array keys with given respective keys

家住魔仙堡 提交于 2019-12-18 13:09:41

问题


I have an array like below

$old = array(
       'a' => 'blah',
       'b' => 'key',
       'c' => 'amazing',
       'd' => array(
                0 => 'want to replace',
                1 => 'yes I want to'
              )
       );

I have another array having keys to replace with key information.

$keyReplaceInfoz = array('a' => 'newA', 'b' => 'newB', 'c' => 'newC', 'd' => 'newD');

I need to replace all keys of array $old with respective values in array $keyReplaceInfo.

Output should be like this

$old = array(
       'newA' => 'blah',
       'newB' => 'key',
       'newC' => 'amazing',
       'newD' => array(
                0 => 'want to replace',
                1 => 'yes I want to'
              )
       );

I had to do it manually as below. I am expecting better option. can anyone suggest better way to accomplish this?

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

I know this can be more simpler.


回答1:


array_combine(array_merge($old, $keyReplaceInfoz), $old)

I think this looks easier than what you posed.




回答2:


Adapting @shawn-k solution, here is more cleaner code using array_walk, it will only replace desired keys, of course you can modify as per your convenience

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:


I just solved this same problem in my own application, but for my application $keyReplaceInfoz acts like the whitelist- if a key is not found, that whole element is removed from the resulting array, while the matching whitelisted keys get translated to the new values.

I suppose you could apply this same algorithm maybe with less total code by clever usage of array_map (http://php.net/manual/en/function.array-map.php), which perhaps another generous reader will do.

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:


This the solution i have implemented for the same subject:

/**
 * 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:


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

This should do the trick as long as you have the same number of values and the same order.




回答6:


This question is old but since it comes up first on Google I thought I'd add solution.

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

Result:

    
    Array
    (
       [FOO] => 1
       [baz] => 2
       [BAR] => 3
    )



回答7:


This works irrespective of array order & array count. Output order & value will be based on 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:


    <?php
$new = array(); 

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

}
?>



回答9:


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

?>


来源:https://stackoverflow.com/questions/11722988/replace-array-keys-with-given-respective-keys

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!