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

3votos

Duda con el manejo de la Función while en PHP

Hola amigos tengo un problema les cuento este es mi codigo para mostrar una consulta:

<?php
//aki selecciono los campos que quiero mostrar que son 2 año y meses
$consulta="SELECT  DISTINCT año,meses from TABLA where id  ORDER BY año desc";
//aki ejecuta la consulta
 $ejecuta=$conexion->query($consulta); 

   while($dato=$ejecuta->fetch_assoc()){

    //me muestra los años y meses

    echo $dato['año'].'  ';
    echo "<br>";
    echo $dato['meses'].'  ';
    echo "<br>";
    echo "<br>";    
   }
?>

este es el resultado en pantalla:

2015
Enero

2015
Febrero

2015
Marzo

2014
Enero

2014
Febrero

2013
Enero

2013
Febrero

Pero lo que yo nesecito es que se muestre asi:

2015

Enero
Febrero
Marzo

2014

Enero
Febrero

2013

Enero
Febrero

Que el año solo se muestre una vez con sus meses correspondientes los registros de año y meses son insertados en otra vista manualmente por un usuario espero me ayuden con un ejemplo !!SALUDOS

3 Respuestas

5votos

carlossevi Puntos63580

La solución más fácil es conservar dentro del bucle while cuál es el último año que se mostró y si no coincide con el actual, entonces se muestra:

$ultimo_año_mostrado = "";   
while($dato=$ejecuta->fetch_assoc()){

    //me muestra los años y meses
    if ($dato['año'] != $ultimo_año_mostrado){
        echo "<br>";
        echo $dato['año'].'  ';
        echo "<br>";
    }
    echo $dato['meses'].'  ';
    echo "<br>";    
    $ultimo_año_mostrado = $dato['año'];
}

0voto

Alan comentado

muchas gracias carlossevi me funciono exelente tu ejemplo !!saludos amigo

2votos

dairon Puntos17140

Buenas, tal vez mi forma no sea la más optima pero yo lo aría de la siguiente forma:

#1. array con indice el año y dentro de este los meses para que luego imprimas por año los meses:

    $annos = array();

#2. una función que devuelva los meses dado un años que estén en la base de datos:

      function __get_meses($anno){
          $consulta="SELECT  DISTINCT meses from TABLA where año = '".$anno."' ORDER BY año desc";
          $ejecuta=$conexion->query($consulta); 
           return $ejecuta->fetch_assoc();
        }

#3. luego comenzaría la programación del llenado:

      $consulta="SELECT  DISTINCT año from TABLA ORDER BY año desc";
      $ejecuta=$conexion->query($consulta); 
       while($annos=$ejecuta->fetch_assoc()){
            $annos['año'] = $this->__get_meses($annos['año']);
       }

#4. y de esas manera tendrías una matriz de años con sus meses y luego para imprimirlos solo haces esto:

      foreach($annos as $anno => $meses){
                echo 'Año: '.$anno;
                foreach ($meses as $mes) {
                echo 'mes: '.$mes;
            }
                echo '</br>'
      }

de Seguro quedan algunos detalles por pulir pues lo escribí rápido y sin debuggear, espero que te sirva la idea en general ya que el código está un tanto feo.
Saludos Dairon

0voto

carlossevi comentado

Lo malo de tu solución es que haces más llamadas de las necesarias a la base de datos y penaliza el rendimiento.

0voto

dairon comentado

es cierto, la escribí con lo primero que me vino a la cabeza ;) sin optimización

4votos

white Puntos75880

Puedes crear un array asociativo para luego imprimirlo esto funcionaria independientemente del orden de tus filas en tu tabla.

$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>';
}

0voto

carlossevi comentado

Me gusta mucho tu solución, más limpia y avanzada.

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