In PHP, how do you change the key of an array element?

后端 未结 23 2339
逝去的感伤
逝去的感伤 2020-11-22 03:45

I have an associative array in the form key => value where key is a numerical value, however it is not a sequential numerical value. The key is actually an I

相关标签:
23条回答
  • 2020-11-22 04:17

    The way you would do this and preserve the ordering of the array is by putting the array keys into a separate array, find and replace the key in that array and then combine it back with the values.

    Here is a function that does just that:

    function change_key( $array, $old_key, $new_key ) {
    
        if( ! array_key_exists( $old_key, $array ) )
            return $array;
    
        $keys = array_keys( $array );
        $keys[ array_search( $old_key, $keys ) ] = $new_key;
    
        return array_combine( $keys, $array );
    }
    
    0 讨论(0)
  • 2020-11-22 04:17

    Hmm, I'm not test before, but I think this code working

    function replace_array_key($data) {
        $mapping = [
            'old_key_1' => 'new_key_1',
            'old_key_2' => 'new_key_2',
        ];
    
        $data = json_encode($data);
        foreach ($mapping as $needed => $replace) {
            $data = str_replace('"'.$needed.'":', '"'.$replace.'":', $data);
        }
    
        return json_decode($data, true);
    }
    
    0 讨论(0)
  • 2020-11-22 04:18

    There is an alternative way to change the key of an array element when working with a full array - without changing the order of the array. It's simply to copy the array into a new array.

    For instance, I was working with a mixed, multi-dimensional array that contained indexed and associative keys - and I wanted to replace the integer keys with their values, without breaking the order.

    I did so by switching key/value for all numeric array entries - here: ['0'=>'foo']. Note that the order is intact.

    <?php
    $arr = [
        'foo',
        'bar'=>'alfa',
        'baz'=>['a'=>'hello', 'b'=>'world'],
    ];
    
    foreach($arr as $k=>$v) {
        $kk = is_numeric($k) ? $v : $k;
        $vv = is_numeric($k) ? null : $v;
        $arr2[$kk] = $vv;
    }
    
    print_r($arr2);
    

    Output:

    Array (
        [foo] => 
        [bar] => alfa
        [baz] => Array (
                [a] => hello
                [b] => world
            )
    )
    
    0 讨论(0)
  • 2020-11-22 04:20

    You can write simple function that applies the callback to the keys of the given array. Similar to array_map

    <?php
    function array_map_keys(callable $callback, array $array) {
        return array_merge([], ...array_map(
            function ($key, $value) use ($callback) { return [$callback($key) => $value]; },
            array_keys($array),
            $array
        ));
    }
    
    $array = ['a' => 1, 'b' => 'test', 'c' => ['x' => 1, 'y' => 2]];
    $newArray = array_map_keys(function($key) { return 'new' . ucfirst($key); }, $array);
    
    echo json_encode($array); // {"a":1,"b":"test","c":{"x":1,"y":2}}
    echo json_encode($newArray); // {"newA":1,"newB":"test","newC":{"x":1,"y":2}}
    

    Here is a gist https://gist.github.com/vardius/650367e15abfb58bcd72ca47eff096ca#file-array_map_keys-php.

    0 讨论(0)
  • 2020-11-22 04:21

    Easy stuff:

    this function will accept the target $hash and $replacements is also a hash containing newkey=>oldkey associations.

    This function will preserve original order, but could be problematic for very large (like above 10k records) arrays regarding performance & memory.

    function keyRename(array $hash, array $replacements) {
        $new=array();
        foreach($hash as $k=>$v)
        {
            if($ok=array_search($k,$replacements))
                $k=$ok;
            $new[$k]=$v;
        }
        return $new;    
    }
    

    this alternative function would do the same, with far better performance & memory usage, at the cost of loosing original order (which should not be a problem since it is hashtable!)

    function keyRename(array $hash, array $replacements) {
    
        foreach($hash as $k=>$v)
            if($ok=array_search($k,$replacements))
            {
              $hash[$ok]=$v;
              unset($hash[$k]);
            }
    
        return $hash;       
    }
    
    0 讨论(0)
  • 2020-11-22 04:22

    You can use this function based on array_walk:

    function mapToIDs($array, $id_field_name = 'id')
    {
        $result = [];
        array_walk($array, 
            function(&$value, $key) use (&$result, $id_field_name)
            {
                $result[$value[$id_field_name]] = $value;
            }
        );
        return $result;
    }
    
    $arr = [0 => ['id' => 'one', 'fruit' => 'apple'], 1 => ['id' => 'two', 'fruit' => 'banana']];
    print_r($arr);
    print_r(mapToIDs($arr));
    

    It gives:

    Array(
        [0] => Array(
            [id] => one
            [fruit] => apple
        )
        [1] => Array(
            [id] => two
            [fruit] => banana
        )
    )
    
    Array(
        [one] => Array(
            [id] => one
            [fruit] => apple
        )
        [two] => Array(
            [id] => two
            [fruit] => banana
        )
    )
    
    0 讨论(0)
提交回复
热议问题