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

后端 未结 23 2360
逝去的感伤
逝去的感伤 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:37

    One which preservers ordering that's simple to understand:

    function rename_array_key(array $array, $old_key, $new_key) {
      if (!array_key_exists($old_key, $array)) {
          return $array;
      }
      $new_array = [];
      foreach ($array as $key => $value) {
        $new_key = $old_key === $key
          ? $new_key
          : $key;
        $new_array[$new_key] = $value;
      }
      return $new_array;
    }
    
    0 讨论(0)
  • 2020-11-22 04:38

    I like KernelM's solution, but I needed something that would handle potential key conflicts (where a new key may match an existing key). Here is what I came up with:

    function swapKeys( &$arr, $origKey, $newKey, &$pendingKeys ) {
        if( !isset( $arr[$newKey] ) ) {
            $arr[$newKey] = $arr[$origKey];
            unset( $arr[$origKey] );
            if( isset( $pendingKeys[$origKey] ) ) {
                // recursion to handle conflicting keys with conflicting keys
                swapKeys( $arr, $pendingKeys[$origKey], $origKey, $pendingKeys );
                unset( $pendingKeys[$origKey] );
            }
        } elseif( $newKey != $origKey ) {
            $pendingKeys[$newKey] = $origKey;
        }
    }
    

    You can then cycle through an array like this:

    $myArray = array( '1970-01-01 00:00:01', '1970-01-01 00:01:00' );
    $pendingKeys = array();
    foreach( $myArray as $key => $myArrayValue ) {
        // NOTE: strtotime( '1970-01-01 00:00:01' ) = 1 (a conflicting key)
        $timestamp = strtotime( $myArrayValue );
        swapKeys( $myArray, $key, $timestamp, $pendingKeys );
    }
    // RESULT: $myArray == array( 1=>'1970-01-01 00:00:01', 60=>'1970-01-01 00:01:00' )
    
    0 讨论(0)
  • 2020-11-22 04:40

    Here is a helper function to achieve that:

    /**
     * Helper function to rename array keys.
     */
    function _rename_arr_key($oldkey, $newkey, array &$arr) {
        if (array_key_exists($oldkey, $arr)) {
            $arr[$newkey] = $arr[$oldkey];
            unset($arr[$oldkey]);
            return TRUE;
        } else {
            return FALSE;
        }
    }
    

    pretty based on @KernelM answer.

    Usage:

    _rename_arr_key('oldkey', 'newkey', $my_array);
    

    It will return true on successful rename, otherwise false.

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

    if your array is built from a database query, you can change the key directly from the mysql statement:

    instead of

    "select ´id´ from ´tablename´..."
    

    use something like:

    "select ´id´ **as NEWNAME** from ´tablename´..."
    
    0 讨论(0)
  • 2020-11-22 04:43

    The answer from KernelM is nice, but in order to avoid the issue raised by Greg in the comment (conflicting keys), using a new array would be safer

    $newarr[$newkey] = $oldarr[$oldkey];
    $oldarr=$newarr;
    unset($newarr);
    
    0 讨论(0)
提交回复
热议问题