Ver Mensaje Individual
  #8 (permalink)  
Antiguo 09/08/2011, 17:47
Avatar de eliza_ralves
eliza_ralves
 
Fecha de Ingreso: junio-2009
Ubicación: Caracas
Mensajes: 126
Antigüedad: 14 años, 10 meses
Puntos: 2
Mensaje Respuesta: Optimizar el recorrido de un Arrays PHP

Hola, ahora no estoy en el trabajo que es donde tengo montado todo, pero te dejo las funciones, tanto la del càlculo de horas como la que tengo para crear el arreglo encabezado:

calcularHoras (query de la bd, aquí hago el filtro de los datos, para éste caso sòlo mostrarè sòlo una parte)

Código PHP:
function calcularHoras($tipo_grafico$dis_select$ofic_select$fechaInicio$fechaFinal$rango){

    
$horasP = array();
    
$horasA = array();
    
    
$link conectarBD ();

    
    
$anualInicioAux $rango[0];
    
$mesActual  $rango[1]; 
    
$anualFinalAux $rango[2];
    
$mesFinalAux $rango[3];
      
    
/** 
     * Verifica si se eligió la opción de disciplina 'Cualquiera' en 
     * la lista correspondiente del formulario, en cuyo caso no se toma filtro por 
     * disciplina
     */
    
if($dis_select == 'Todas'){
    
        
$consultDisc " AND 1=1";
        
    }else{
    
        
/**
         * Si se incluyó, se realiza la consulta por dicha disciplina
         */
        
$consultDisc " AND E.Nombre_Disciplina = '" $dis_select"' ";
    
    }
    
    
/** 
     * Verifica si se elegió la opción de la oficina 'Cualquiera' en 
     * la lista correspondiente del formulario, en cuyo caso no se toma filtro 
     * por oficina
     */
    
if($ofic_select == 'Todas'){
    
        
$consultOfic " AND 1=1";
        
    }else{

        
/**
         * Si se incluyó, se realiza la consulta por dicha disciplina
         */
        
$consultOfic " AND E.Codigo_Oficina = '" $ofic_select "' ";
    
    }
    

    
/**   
     * Cosulta para cuando el Tipo de Gráfico elegido es General
     * el cual incluye los Proyectos y las Actividades
     */  
   
if($tipo_grafico == 'G'){
        
        
$queryP =   "SELECT Ano_Semana, Mes_Semana, SUM(P.Cantidad_Horas) AS Horas
                    FROM SPO2_Participa P, SPO2_Empleado E, SPO2_Evento EV
                    WHERE P.Codigo_Empleado = E.Codigo
                    AND P.Codigo_Evento = EV.Codigo" 
                    
$consultDisc $consultOfic .
                    AND EV.Tipo = 'P'
                    AND (      
                            (P.Ano_Semana > '" 
$anualInicioAux "' )
                         OR ((P.Ano_Semana = '" 
$anualInicioAux "') AND (P.Mes_Semana >= '" $mesActual "'))
                        )
                    AND (      
                            (P.Ano_Semana < '" 
$anualFinalAux .  "' )
                         OR ((P.Ano_Semana = '" 
$anualFinalAux .  "') AND (P.Mes_Semana <= '" $mesFinalAux ."'))
                        )
                    GROUP BY Ano_Semana, Mes_Semana
                    ORDER BY Ano_Semana, Mes_Semana"
;

       
$resultP odbc_exec($link$queryP)
            or die(
"Fallo en la ejecución de la consulta sobre la Base de 
                          Datos. Favor Notificar a Soporte Tecnico: " 
odbc_errormsg());

    
$numero_filasP odbc_num_rows $resultP );  
        
        for (
$i 1$i <= $numero_filasP$i++) {
        
            
$rowP odbc_fetch_array($resultP);
            
$horasP[$i] = $rowP;
            
        }
    
        
$queryA =   "SELECT Ano_Semana, Mes_Semana, SUM(P.Cantidad_Horas) AS Horas
                    FROM SPO2_Participa P, SPO2_Empleado E, SPO2_Evento EV
                    WHERE P.Codigo_Empleado = E.Codigo
                    AND P.Codigo_Evento = EV.Codigo" 
                    
$consultDisc $consultOfic .
                    AND EV.Tipo = 'A'
                    AND (      
                            (P.Ano_Semana > '" 
$anualInicioAux "' )
                         OR ((P.Ano_Semana = '" 
$anualInicioAux "') AND (P.Mes_Semana >= '" $mesActual "'))
                        )
                    AND (      
                            (P.Ano_Semana < '" 
$anualFinalAux .  "' )
                         OR ((P.Ano_Semana = '" 
$anualFinalAux .  "') AND (P.Mes_Semana <= '" $mesFinalAux ."'))
                        )
                    GROUP BY Ano_Semana, Mes_Semana
                    ORDER BY Ano_Semana, Mes_Semana"
;

       
$resultA odbc_exec($link$queryA)
            or die(
"Fallo en la ejecución de la consulta sobre la Base de 
                          Datos. Favor Notificar a Soporte Tecnico: " 
odbc_errormsg());

        
$numero_filasA odbc_num_rows $resultA );  
            
        for (
$i 1$i <= $numero_filasA$i++) {
        
            
$rowA odbc_fetch_array($resultA);
            
$horasA[$i] = $rowA;
        }
    
        
/**
         * Cierra la conexión abierta con la BD
         */ 
        
desconectarBD_Pronostico($link);
        
        return array(
$horasP$horasA);
        
    }
    

obtenerEncabezadosGrafico (que es lo que utilizo cómo base para formar un arreglo que contiene todos los meses contenidos dentro de la fecha escogida y así formar el eje x del grafico, es decir, los meses)

Código PHP:
/**
 * Función: obtenerEncabezadosGrafico
 *
 * @param string $desde
 * @param string $hasta
 * @return array $anualInicioAux|$mesActual|$anualFinalAux|$mesFinalAux
 *
 * Descripción: Devuelve los meses y el año, dado un rango de fechas para
 * utilizarlo en la visualización de los gráficos.
 */

  
function obtenerEncabezadosGrafico($desde$hasta){
    
    
$encabezados = array();
    
$i 1;

    
/**
     * Conversión de las fechas al formato Mes/Día/Año
     * @example: $fecha= '02/08/2011'
     *           $fechaAux= '08/02/2011'
     */    
    
$desdeAux convertirFecha_MDA($desde);
    
$hastaAux convertirFecha_MDA($hasta);

    
/**
     * Tratamiento para la obtención de la Semana, Mes y Año de la fecha de inicio
     */    
    
$semanaInicial obtenerNumSemana($desdeAux);
    
$mesInicial    obtenerNumMes($desdeAux);
    
$anualInicio   obtenerNumeroAnual($desdeAux);

    if(
$semanaInicial == && $mesInicial == 12)
        
$anualInicioAux $anualInicio 1;
    else if((
$semanaInicial == 52 || $semanaInicial == 53) && $mesInicial == 1)
            
$anualInicioAux $anualInicio 1;
         else
            
$anualInicioAux $anualInicio;
            
    
$mesActual obtenerNumMesDeSemana($semanaInicial$anualInicioAux);

    
/**
     * Tratamiento para la obtención de la Semana, Mes y Año de la fecha de final
     */ 
    
$semanaFinal obtenerNumSemana($hastaAux);
    
$mesFinal    obtenerNumMes($hastaAux);
    
$anualFinal  obtenerNumeroAnual($hastaAux);

    if(
$semanaFinal == && $mesFinal == 12)
        
$anualFinalAux $anualFinal 1;
    else if(
$semanaFinal == 52 && $mesFinal == 1)
            
$anualFinalAux $anualFinal 1;
        else
            
$anualFinalAux $anualFinal;
            
    
$mesFinalAux obtenerNumMesDeSemana($semanaFinal$anualFinalAux);

    
/**
     * Se registra en la primera posición del arreglo, el Mes y Año de la fecha inicial
     */ 
    
$encabezados[$i] = array($mesActual$anualInicioAux);
    
$mesActual++;
    
$i++;
    
    if(
$semanaInicial == 52)
        
$semanaActual 1;
    else
        
$semanaActual $semanaInicial 1;
        
    
$anualActual $anualInicioAux;

    
/**
     * Recorrido para obtener el Mes y Año de los valores que se encuentran dentro
     * de la fecha inicial y fecha final
     */ 
    
while($anualActual <= $anualFinalAux){
        if(
$anualActual == $anualFinalAux){
            
            while(
$mesActual $mesFinalAux){
                
$encabezados[$i] = array($mesActual$anualActual);
                
$i++;
                
$mesActual++;
            }
            
            
/**
             * Condicional para cuando el Mes y Año sean iguales a la fecha final, es decir,
             * se haya llegado al tope del rango, dado por la fecha final
             */
            
if($mesActual == $mesFinalAux){
                
$encabezados[$i] = array($mesFinalAux$anualFinal);
                
$i++;
            }
        
        } else {
        
            while(
$mesActual <= 12){
                
$encabezados[$i] = array($mesActual$anualActual);
                
$i++;
                
$mesActual++;
            }  
        }
        
$mesActual=1;
        
$anualActual++;
    }
    return 
$encabezados;

Además lo que me arroja la BD es la siguiente:
Ano_Semana/Mes_Semana/Numero_Semana/Horas
2020 1 2 40
2020 1 3 40
2020 1 4 40
2020 1 5 40
2020 1 6 40
2020 1 7 40
2020 1 8 40
2020 1 9 40
2020 3 10 40
2020 3 11 8
2020 8 32 32
2020 8 33 40
2020 8 34 40
2020 8 35 40
2020 9 36 40
2020 9 37 40
2020 9 38 40
2020 9 39 40
2020 10 40 40
2020 10 41 40
2020 10 42 40
2020 10 43 40
2020 10 44 40

Mañana estaré colocando el contenido de los arreglos

Saludos vgonga1986!
__________________
“El mayor enemigo del conocimiento no es la ignorancia, sino la ilusión del conocimiento”— Stephen Hawking