replace array keys with given respective keys

前端 未结 10 1153
轻奢々
轻奢々 2020-12-29 09:16

I have an array like below

$old = array(
       \'a\' => \'blah\',
       \'b\' => \'key\',
       \'c\' => \'amazing\',
       \'d\' => array(
          


        
相关标签:
10条回答
  • 2020-12-29 09:43

    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
        )
    
    0 讨论(0)
  • 2020-12-29 09:45

    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);
    
    0 讨论(0)
  • 2020-12-29 09:47
    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.

    0 讨论(0)
  • 2020-12-29 09:51

    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;
    }
    
    0 讨论(0)
  • 2020-12-29 09:56
    array_combine(array_merge($old, $keyReplaceInfoz), $old)
    

    I think this looks easier than what you posed.

    0 讨论(0)
  • 2020-12-29 09:56

    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);
    
    0 讨论(0)
提交回复
热议问题