entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Problema para Ordenar los Meses del Año PHP

Hola amigos tengo un problema para ordenar los meses del año les explico este es el codigo de la consulta:

$consulta="SELECT  DISTINCT años,meses from TABLA where id ";
$ejecutar=$conexion->query($consulta); 

   $ultimoaño = ""; 
   while($dato=$ejecutar->fetch_assoc()){

     if ($dato['años'] != $ultimo_año){

        echo $dato['años'].'  ';     
    }
    echo $dato['meses'].'  ';    
    $ultimoaño = $dato['anos'];
}

al mostrar la consulta me la muestra en pantalla asi desordenados:

2015
Abril
Agosto
Enero
Febrero
Julio
Junio
Marzo
Mayo
Noviembre
Octubre
Septiembre

pero lo que trato de aser es que me los muestre ordenados asi:

2015
Enero
Febrero
Marzo
Abril
Mayo 
Junio
Julio
Agosto
Septiembre
Noviembre
Diciembre

los meses son colocados manualmente por el usuario espero me ayuden con un ejemplo y gracias !!saludos

2 Respuestas

2votos

carlossevi Puntos63580

Los meses te salen perfectamente ordenados... alfabéticamente.

Siempre es difícil trabajar con fechas en modo texto en las bases de datos. Las consultas se hacen complejas de formular y también la ejecución es más costosa para el motor de la base de datos. Si además quieres aplicar en el futuro filtros más complejos (por ejemplo: "sacar los datos de los meses entre febrero y junio de todos los años del histórico") lo recomendable es trabajar con los tipos adecuados para cada dato.

En este caso para poder ordenar los meses necesitas el valor numérico del mes y no el valor textual. Lo necesitas al menos para hacer order en la consulta, aunque después no lo muestres en la selección de campos.

Opción 1: tu TABLA contiene la columna mes_num (el número del mes):

Select Distinct años,meses From TABLA Where * 
Order by año Desc, mes_num Asc

Opción 2: No tocas tu tabla original y creas una tabla de referencia con los nombres de los meses y su orden:

Tabla MESES 
(orden, descripcion)
--------------------
1, Enero
2, Febrero...

La consulta quedaría:

Select Distinct TABLA.año, TABLA.mes 
From TABLA
Join MESES On MESES.descripcion = TABLA.mes
Where * 
Order by TABLA.año Desc, MESES.orden Asc

Esta opción es más compleja y menos recomendable a largo plazo, pero te permite dejar la estructura de tu tabla original sin modificar.

Lo ideal sería lo contrario: en la tabla de datos conservar el valor numérico del mes, y en la tabla adicional el valor textual con el nombre del mes. Además eso te permitirá más adelante poder dar la información en varios idiomas.

0voto

Alan comentado

Gracias carlossevi me sirvio tu ejemplo SALUDOS!!

2votos

white Puntos75880

Lo correcto sería que estructures tu base de datos como lo menciona @carlossevi, te surgiran mas problemas en el futuro si no estructuras correctamente tu base de datos.

Sin embargo si deseas ordenarlo sin tocar la base de datos o hacer una consulta puedes usar arreglos, tomando como base mi respuesta a tu pregunta anterior:

<?php

$datos = array();

while( $dato = $ejecuta->fetch_assoc() )
{
    $datos[$dato['año']][] = $dato['meses'];
}

foreach( $datos as $year => $months )
{
     echo $year . '<br>';
     echo implode('<br>', $months);
     echo '<hr>';
}

$months_list = array(
    'enero', 'febrero', 'marzo', 'abril',
    'mayo', 'junio', 'julio', 'agost',
    'septiembre', 'octubre', 'noviembre', 'diciembre'
);

foreach( $datos as $year => $months )
{
    uasort($months, function($a, $b) use($months_list)
    {
        $pos_a = array_search(strtolower($a), $months_list);
        $pos_b = array_search(strtolower($b), $months_list);

        if($pos_a == $pos_b)
            return 0;

        return $pos_a > $pos_b ? 1 : -1;
    });

    echo $year . '<br>';
    echo implode('<br>', $months);
    echo '<hr>';
}

Nota: El código funcionaría en php >= 5.3 si deseas usarlo en una version anterior: http://codepad.org/ybjL3I57

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta