You can add another array to keep track the order of declaration:

    YELLOW=$'\e[93m'                                                                
    declare -A OP=( [Description]="remote to destination"                           
                    [Source]="/var/www"                                             
                    [Destination]="/foo/bar"                                        
                    [Log]="my.log"                                                  
                    [Email]="me@here" )                                             
                                                                                    
    declare -A IP=( [1]="Description"                                               
                    [2]="Source"                                                    
                    [3]="Destination"                                               
                    [4]="Log"                                                       
                    [5]="Email" );                                                  
                                                                                    
    NO_COLS=$(tput cols)                                                            
    COLS_PER_COL=$((NO_COLS/3))                                                     
    PRINT_FORMAT="%"$COLS_PER_COL"s%""s\n"                                          
                                                                                    
    for i in "${!IP[@]}"; do                                                        
      k=${IP[$i]}                                                                   
      printf "$PRINT_FORMAT" "$k :" " $YELLOW${OP[$k]}$ENDCOL"                      
    done